[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 001/111] linux-user: Signals processing is not threa
From: |
Bryce Lanham |
Subject: |
[Qemu-devel] [PATCH 001/111] linux-user: Signals processing is not thread-safe. |
Date: |
Wed, 17 Aug 2011 15:46:06 -0500 |
From: Alexander Paramonov <address@hidden>
Signed-off-by: Alexander Paramonov <address@hidden>
Signed-off-by: Laurent Vivier <address@hidden>
---
linux-user/qemu.h | 1 +
linux-user/signal.c | 39 +++++++++++++++++++++++++++++++--------
2 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/linux-user/qemu.h b/linux-user/qemu.h
index 627c8b3..ae87149 100644
--- a/linux-user/qemu.h
+++ b/linux-user/qemu.h
@@ -87,6 +87,7 @@ struct vm86_saved_state {
struct sigqueue {
struct sigqueue *next;
target_siginfo_t info;
+ pid_t pid;
};
struct emulated_sigtable {
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 07ad07a..0ba11bd 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -472,6 +472,7 @@ int queue_signal(CPUState *env, int sig, target_siginfo_t
*info)
*pq = q;
q->info = *info;
q->next = NULL;
+ q->pid = getpid();
k->pending = 1;
/* signal that a new signal is pending */
ts->signal_pending = 1;
@@ -5231,21 +5232,34 @@ void process_pending_signals(CPUState *cpu_env)
target_sigset_t target_old_set;
struct emulated_sigtable *k;
struct target_sigaction *sa;
- struct sigqueue *q;
- TaskState *ts = cpu_env->opaque;
+ struct sigqueue *q, *q_prev;
+ TaskState *ts = thread_env->opaque;
if (!ts->signal_pending)
return;
- /* FIXME: This is not threadsafe. */
k = ts->sigtab;
+ int signal_pending = 0;
for(sig = 1; sig <= TARGET_NSIG; sig++) {
if (k->pending)
- goto handle_signal;
+ {
+ q = k->first;
+ q_prev = NULL;
+ while (q)
+ {
+ if (q->pid == getpid())
+ goto handle_signal;
+ else
+ signal_pending = 1;
+ q_prev = q;
+ q = q->next;
+ }
+ }
k++;
}
+
/* if no signal is pending, just return */
- ts->signal_pending = 0;
+ ts->signal_pending = signal_pending;
return;
handle_signal:
@@ -5253,9 +5267,18 @@ void process_pending_signals(CPUState *cpu_env)
fprintf(stderr, "qemu: process signal %d\n", sig);
#endif
/* dequeue signal */
- q = k->first;
- k->first = q->next;
- if (!k->first)
+ if (q_prev == k->first)
+ {
+ q = k->first;
+ k->first = q->next;
+ if (!k->first)
+ {
+ k->pending = 0;
+ }
+ }
+ else if (q_prev)
+ q_prev->next = q->next;
+ else
k->pending = 0;
sig = gdb_handlesig (cpu_env, sig);
--
1.7.2.3
- [Qemu-devel] [RFC][PATCH 000/111] QEMU m68k core additions, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 001/111] linux-user: Signals processing is not thread-safe.,
Bryce Lanham <=
- [Qemu-devel] [PATCH 002/111] linux-user: add qemu-wrapper, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 003/111] linux-user: define default cpu model in configure instead of linux-user/main.c, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 004/111] linux-user: specify the cpu model during configure, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 006/111] linux-user: define new environment variables, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 007/111] linux-user: define a script to set binfmt using debian flavored tools, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 008/111] linux-user: define default cpu model in configure instead of linux-user/main.c, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 009/111] m68k: add tcg_gen_debug_insn_start(), Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 005/111] linux-user,m68k: display default cpu, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 010/111] m68k: define m680x0 CPUs and features, Bryce Lanham, 2011/08/17
- [Qemu-devel] [PATCH 011/111] m68k: add missing accessing modes for some instructions., Bryce Lanham, 2011/08/17