aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2016-05-27 15:18:37 +0100
committerPeter Maydell <peter.maydell@linaro.org>2016-05-27 15:18:37 +0100
commitb12771df81c25a394709bd598d05af51dcdca297 (patch)
tree18aab65d0edfbc82bdebd44af1fc61c5dfb3d23d
parentd6550e9ed2e1a60d889dfb721de00d9a4e3bafbe (diff)
downloadqemu-arm-b12771df81c25a394709bd598d05af51dcdca297.tar.gz
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>
-rw-r--r--linux-user/signal.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 8090b4de1f..a9ac491af4 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;