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
|
#endif
|
||||||
|
|
||||||
|
static void handle_pending_signal(CPUArchState *cpu_env, int sig);
|
||||||
|
|
||||||
void process_pending_signals(CPUArchState *cpu_env)
|
void process_pending_signals(CPUArchState *cpu_env)
|
||||||
{
|
{
|
||||||
CPUState *cpu = ENV_GET_CPU(cpu_env);
|
CPUState *cpu = ENV_GET_CPU(cpu_env);
|
||||||
int sig;
|
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;
|
TaskState *ts = cpu->opaque;
|
||||||
|
|
||||||
if (!ts->signal_pending)
|
if (!ts->signal_pending)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* FIXME: This is not threadsafe. */
|
/* FIXME: This is not threadsafe. */
|
||||||
k = ts->sigtab;
|
|
||||||
for(sig = 1; sig <= TARGET_NSIG; sig++) {
|
for(sig = 1; sig <= TARGET_NSIG; sig++) {
|
||||||
if (k->pending)
|
if (ts->sigtab[sig - 1].pending) {
|
||||||
goto handle_signal;
|
handle_pending_signal(cpu_env, sig);
|
||||||
k++;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* if no signal is pending, just return */
|
/* if no signal is pending, just return */
|
||||||
ts->signal_pending = 0;
|
ts->signal_pending = 0;
|
||||||
return;
|
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);
|
trace_user_handle_signal(cpu_env, sig);
|
||||||
/* dequeue signal */
|
/* dequeue signal */
|
||||||
q = k->first;
|
q = k->first;
|
||||||
|
Loading…
Reference in New Issue
Block a user