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:
parent
575b22b1b7
commit
eb5525013a
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user