linux-user: Factor out handle_signal code from process_pending_signals()

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 <peter.maydell@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
Peter Maydell 2016-05-27 15:51:43 +01:00 committed by Riku Voipio
parent 575b22b1b7
commit eb5525013a
1 changed files with 18 additions and 11 deletions

View File

@ -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;