[CRIU] [PATCH]v2 service: add "one connection -- multiple requests" support

Pavel Emelyanov xemul at parallels.com
Fri Nov 22 09:39:04 PST 2013


On 11/23/2013 12:36 AM, Ruslan Kuprieiev wrote:
> Currently we use "one connection -- one request" politics. This patch allows to
> connect to criu once and send multiple requests.
> 
> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
> ---
>  cr-service.c | 53 +++++++++++++++++++++++++++++++----------------------
>  1 file changed, 31 insertions(+), 22 deletions(-)
> 
> diff --git a/cr-service.c b/cr-service.c
> index eba5342..73158f7 100644
> --- a/cr-service.c
> +++ b/cr-service.c
> @@ -33,13 +33,16 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg)
>  		return -1;
>  	}
>  
> +	if (len == 0)
> +		return 0;
> +
>  	*msg = criu_req__unpack(NULL, len, buf);
>  	if (!*msg) {
>  		pr_perror("Failed unpacking request");
>  		return -1;
>  	}
>  
> -	return 0;
> +	return 1;
>  }
>  
>  static int send_criu_msg(int socket_fd, CriuResp *msg)
> @@ -231,38 +234,44 @@ static int check(int sk)
>  
>  static int cr_service_work(int sk)
>  {
> +	int ret;
>  	CriuReq *msg = 0;
> +	CriuResp err_resp = CRIU_RESP__INIT;
> +
> +	err_resp.type = CRIU_REQ_TYPE__EMPTY;
> +	err_resp.success = false;
>  
>  	init_opts();
>  
> -	if (recv_criu_msg(sk, &msg) == -1) {
> -		pr_perror("Can't recv request");
> -		goto err;
> -	}
> +	do {
> +		ret = recv_criu_msg(sk, &msg);
> +		if (ret < 0)
> +			goto err;
>  
> -	switch (msg->type) {
> -	case CRIU_REQ_TYPE__DUMP:
> -		return dump_using_req(sk, msg->opts);
> -	case CRIU_REQ_TYPE__RESTORE:
> -		return restore_using_req(sk, msg->opts);
> -	case CRIU_REQ_TYPE__CHECK:
> -		return check(sk);
> +		if (ret == 0)
> +			break;
>  
> -	default: {
> -		CriuResp resp = CRIU_RESP__INIT;
> +		switch (msg->type) {
> +		case CRIU_REQ_TYPE__DUMP:
> +			return dump_using_req(sk, msg->opts);
> +		case CRIU_REQ_TYPE__RESTORE:
> +			return restore_using_req(sk, msg->opts);
> +		case CRIU_REQ_TYPE__CHECK:
> +			return check(sk);
>  
> -		resp.type = CRIU_REQ_TYPE__EMPTY;
> -		resp.success = false;
> -		/* XXX -- add optional error code to CriuResp */
> +		default:
> +			goto err;
> +		}
>  
> -		pr_perror("Invalid request");
> -		send_criu_msg(sk, &resp);
> +	} while (1);

Please explain me how this loop can continue? It's body is
either ended with break; or return <something>; :\

>  
> -		goto err;
> -	}
> -	}
> +	return 0;
>  
>  err:
> +	/* XXX -- add optional error code to CriuResp */
> +
> +	send_criu_msg(sk, &err_resp);
> +
>  	return -1;
>  }
>  
> 




More information about the CRIU mailing list