[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