aboutsummaryrefslogtreecommitdiff
path: root/linux-user/qemu.h
diff options
context:
space:
mode:
authorpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2008-05-31 16:11:38 +0000
committerpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2008-05-31 16:11:38 +0000
commit624f7979058b84cbf81c76d45f302ce757b213ca (patch)
treef226ad71b17a623c4bd4eefdfeceb15fbb71b765 /linux-user/qemu.h
parentafd7cd92e848f094cce4a03286e03634f49be573 (diff)
Make signal queues per thread.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4635 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'linux-user/qemu.h')
-rw-r--r--linux-user/qemu.h26
1 files changed, 23 insertions, 3 deletions
diff --git a/linux-user/qemu.h b/linux-user/qemu.h
index cc44c9a19a..8b114954f0 100644
--- a/linux-user/qemu.h
+++ b/linux-user/qemu.h
@@ -82,6 +82,20 @@ struct vm86_saved_state {
#include "nwfpe/fpa11.h"
#endif
+#define MAX_SIGQUEUE_SIZE 1024
+
+struct sigqueue {
+ struct sigqueue *next;
+ target_siginfo_t info;
+};
+
+struct emulated_sigtable {
+ int pending; /* true if signal is pending */
+ struct sigqueue *first;
+ struct sigqueue info; /* in order to always have memory for the
+ first signal, we put it here */
+};
+
/* NOTE: we force a big alignment so that the stack stored after is
aligned too */
typedef struct TaskState {
@@ -109,10 +123,16 @@ typedef struct TaskState {
#endif
int used; /* non zero if used */
struct image_info *info;
+
+ struct emulated_sigtable sigtab[TARGET_NSIG];
+ struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
+ struct sigqueue *first_free; /* first free siginfo queue entry */
+ int signal_pending; /* non zero if a signal may be pending */
+
uint8_t stack[0];
} __attribute__((aligned(16))) TaskState;
-extern TaskState *first_task_state;
+void init_task_state(TaskState *ts);
extern const char *qemu_uname_release;
/* ??? See if we can avoid exposing so much of the loader internals. */
@@ -182,9 +202,9 @@ void print_syscall_ret(int num, abi_long arg1);
extern int do_strace;
/* signal.c */
-void process_pending_signals(void *cpu_env);
+void process_pending_signals(CPUState *cpu_env);
void signal_init(void);
-int queue_signal(int sig, target_siginfo_t *info);
+int queue_signal(CPUState *env, int sig, target_siginfo_t *info);
void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
int target_to_host_signal(int sig);