[CRIU] [PATCH 06/14] crtools: restore pending signals (v4)

Pavel Emelyanov xemul at parallels.com
Mon Mar 25 15:07:40 EDT 2013


> @@ -155,6 +155,37 @@ static void restore_rlims(struct task_restore_core_args *ta)
>  	}
>  }
>  
> +static int restore_signals(siginfo_t *ptr, int nr, int group)

bool group

> +{
> +	int ret, i;
> +	k_rtsigset_t to_block;
> +
> +	ksigfillset(&to_block);
> +	ret = sys_sigprocmask(SIG_SETMASK, &to_block, NULL, sizeof(k_rtsigset_t));
> +	if (ret) {
> +		pr_err("Unable to block signals %d", ret);
> +		return -1;
> +	}
> +
> +	for (i = 0; i < nr; i++) {
> +		siginfo_t *info = ptr + i;
> +
> +		pr_info("Restore signal %d group %d\n", info->si_signo, group);
> +		if (group)
> +			ret = sys_rt_sigqueueinfo(sys_getpid(), info->si_signo, info);
> +		else
> +			ret = sys_rt_tgsigqueueinfo(sys_getpid(),
> +						sys_gettid(), info->si_signo, info);
> +		if (ret) {
> +			pr_err("Unable to send siginfo %d %x with code %d\n",
> +					info->si_signo, info->si_code, ret);
> +			return -1;;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  static int restore_thread_common(struct rt_sigframe *sigframe,
>  		struct thread_restore_args *args)
>  {
> @@ -210,8 +241,11 @@ long __export_restore_thread(struct thread_restore_args *args)
>  	pr_info("%ld: Restored\n", sys_gettid());
>  
>  	restore_finish_stage(CR_STATE_RESTORE);
> -	restore_finish_stage(CR_STATE_RESTORE_SIGCHLD);
>  
> +	if (restore_signals(args->siginfo, args->siginfo_nr, 0))
> +		goto core_restore_end;

Why isn't it in restore_thread_common ?

> +
> +	restore_finish_stage(CR_STATE_RESTORE_SIGCHLD);
>  	futex_dec_and_wake(&thread_inprogress);
>  
>  	new_sp = (long)rt_sigframe + SIGFRAME_OFFSET;


More information about the CRIU mailing list