[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 06/44] linux-user: Factor out handle_signal code from
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL 06/44] linux-user: Factor out handle_signal code from process_pending_signals() |
Date: |
Wed, 8 Jun 2016 16:29:47 +0300 |
From: Peter Maydell <address@hidden>
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>
Signed-off-by: Riku Voipio <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;
--
2.1.4
- [Qemu-devel] [PULL 00/44] linux-user update, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 01/44] linux-user: Fix qemu-binfmt-conf.sh to store config across reboot, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 04/44] linux-user: add netlink audit, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 03/44] linux-user: support netlink protocol NETLINK_KOBJECT_UEVENT, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 02/44] linux-user: add rtnetlink(7) support, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 06/44] linux-user: Factor out handle_signal code from process_pending_signals(),
riku . voipio <=
- [Qemu-devel] [PULL 07/44] linux-user: Move handle_pending_signal() to avoid need for declaration, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 05/44] linux-user: check if NETLINK_ROUTE is available, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 10/44] linux-user: Define macro for size of host kernel sigset_t, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 08/44] linux-user: Fix stray tab-indent, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 09/44] linux-user: Factor out uses of do_sigprocmask() from sigreturn code, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 11/44] linux-user: Use safe_syscall for sigsuspend syscalls, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 13/44] linux-user: Remove redundant default action check in queue_signal(), riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 18/44] linux-user: pause() should not pause if signal pending, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 14/44] linux-user: Remove redundant gdb_queuesig(), riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 12/44] linux-user: Fix race between multiple signals, riku . voipio, 2016/06/08