[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 01/19] linux-user: Factor out handle_signal c
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH v2 01/19] linux-user: Factor out handle_signal code from process_pending_signals() |
Date: |
Mon, 6 Jun 2016 23:42:11 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 |
Le 27/05/2016 à 16:51, Peter Maydell a écrit :
> Factor out the code to handle a single signal from the
> process_pending_signals() function. The use of goto for flow control
> is OK currently, but would get significantly uglier if extended to
> allow running the handle_signal code multiple times.
>
> Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Laurent Vivier <address@hidden>
> ---
> linux-user/signal.c | 29 ++++++++++++++++++-----------
> 1 file changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/linux-user/signal.c b/linux-user/signal.c
> index 8090b4d..a9ac491 100644
> --- a/linux-user/signal.c
> +++ b/linux-user/signal.c
> @@ -5765,33 +5765,40 @@ long do_rt_sigreturn(CPUArchState *env)
>
> #endif
>
> +static void handle_pending_signal(CPUArchState *cpu_env, int sig);
> +
> void process_pending_signals(CPUArchState *cpu_env)
> {
> CPUState *cpu = ENV_GET_CPU(cpu_env);
> int sig;
> - abi_ulong handler;
> - sigset_t set, old_set;
> - target_sigset_t target_old_set;
> - struct emulated_sigtable *k;
> - struct target_sigaction *sa;
> - struct sigqueue *q;
> TaskState *ts = cpu->opaque;
>
> if (!ts->signal_pending)
> return;
>
> /* FIXME: This is not threadsafe. */
> - k = ts->sigtab;
> for(sig = 1; sig <= TARGET_NSIG; sig++) {
> - if (k->pending)
> - goto handle_signal;
> - k++;
> + if (ts->sigtab[sig - 1].pending) {
> + handle_pending_signal(cpu_env, sig);
> + return;
> + }
> }
> /* if no signal is pending, just return */
> ts->signal_pending = 0;
> return;
> +}
> +
> +static void handle_pending_signal(CPUArchState *cpu_env, int sig)
> +{
> + CPUState *cpu = ENV_GET_CPU(cpu_env);
> + abi_ulong handler;
> + sigset_t set, old_set;
> + target_sigset_t target_old_set;
> + struct target_sigaction *sa;
> + struct sigqueue *q;
> + TaskState *ts = cpu->opaque;
> + struct emulated_sigtable *k = &ts->sigtab[sig - 1];
>
> - handle_signal:
> trace_user_handle_signal(cpu_env, sig);
> /* dequeue signal */
> q = k->first;
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PATCH v2 01/19] linux-user: Factor out handle_signal code from process_pending_signals(),
Laurent Vivier <=