|
From: Jeremy F. <je...@go...> - 2004-03-16 08:27:35
|
CVS commit by fitzhardinge:
Make the sigaltstack per-thread state, so that two threads handling a
signal at once don't share the same stack.
M +3 -0 vg_include.h 1.186
M +6 -1 vg_scheduler.c 1.143
M +25 -24 vg_signals.c 1.65
--- valgrind/coregrind/vg_scheduler.c #1.142:1.143
@@ -3307,5 +3307,10 @@ void scheduler_sanity ( void )
stack_used = (Addr)VG_(threads)[i].stack_highest_word
- (Addr)VG_(threads)[i].m_esp;
- if (i > 1 /* not the root thread */
+
+ /* This test is a bit bogus - it doesn't take into account
+ alternate signal stacks, for a start. Also, if a thread
+ has it's stack pointer somewhere strange, killing Valgrind
+ isn't the right answer. */
+ if (0 && i > 1 /* not the root thread */
&& stack_used
>= (VG_PTHREAD_STACK_MIN - 1000 /* paranoia */)) {
--- valgrind/coregrind/vg_signals.c #1.64:1.65
@@ -174,7 +174,4 @@ typedef
SCSS_Per_Signal scss_per_sig[1+VKI_KNSIG];
- /* Signal delivery stack, if any. */
- vki_kstack_t altstack;
-
/* Additional elements to SCSS not stored here:
- for each thread, the thread's blocking mask
@@ -457,15 +454,19 @@ void VG_(handle_SCSS_change) ( Bool forc
/* True if we are on the alternate signal stack. */
-static Int on_sig_stack ( Addr m_esp )
+static Int on_sig_stack ( ThreadId tid, Addr m_esp )
{
- return (m_esp - (Addr)vg_scss.altstack.ss_sp
- < vg_scss.altstack.ss_size);
+ ThreadState *tst = VG_(get_ThreadState)(tid);
+
+ return (m_esp - (Addr)tst->altstack.ss_sp
+ < tst->altstack.ss_size);
}
-static Int sas_ss_flags ( Addr m_esp )
+static Int sas_ss_flags ( ThreadId tid, Addr m_esp )
{
- return (vg_scss.altstack.ss_size == 0
+ ThreadState *tst = VG_(get_ThreadState)(tid);
+
+ return (tst->altstack.ss_size == 0
? VKI_SS_DISABLE
- : on_sig_stack(m_esp) ? VKI_SS_ONSTACK : 0);
+ : on_sig_stack(tid, m_esp) ? VKI_SS_ONSTACK : 0);
}
@@ -489,11 +490,11 @@ void VG_(do__NR_sigaltstack) ( ThreadId
if (oss != NULL) {
- oss->ss_sp = vg_scss.altstack.ss_sp;
- oss->ss_size = vg_scss.altstack.ss_size;
- oss->ss_flags = vg_scss.altstack.ss_flags | sas_ss_flags(m_esp);
+ oss->ss_sp = VG_(threads)[tid].altstack.ss_sp;
+ oss->ss_size = VG_(threads)[tid].altstack.ss_size;
+ oss->ss_flags = VG_(threads)[tid].altstack.ss_flags | sas_ss_flags(tid, m_esp);
}
if (ss != NULL) {
- if (on_sig_stack(VG_(threads)[tid].m_esp)) {
+ if (on_sig_stack(tid, VG_(threads)[tid].m_esp)) {
SET_SYSCALL_RETVAL(tid, -VKI_EPERM);
return;
@@ -506,5 +507,5 @@ void VG_(do__NR_sigaltstack) ( ThreadId
}
if (ss->ss_flags == VKI_SS_DISABLE) {
- vg_scss.altstack.ss_flags = VKI_SS_DISABLE;
+ VG_(threads)[tid].altstack.ss_flags = VKI_SS_DISABLE;
} else {
if (ss->ss_size < VKI_MINSIGSTKSZ) {
@@ -513,7 +514,7 @@ void VG_(do__NR_sigaltstack) ( ThreadId
}
- vg_scss.altstack.ss_sp = ss->ss_sp;
- vg_scss.altstack.ss_size = ss->ss_size;
- vg_scss.altstack.ss_flags = 0;
+ VG_(threads)[tid].altstack.ss_sp = ss->ss_sp;
+ VG_(threads)[tid].altstack.ss_size = ss->ss_size;
+ VG_(threads)[tid].altstack.ss_flags = 0;
}
}
@@ -922,5 +923,5 @@ static void synth_ucontext(ThreadId tid,
uc->uc_link = 0;
uc->uc_sigmask = *set;
- uc->uc_stack = vg_scss.altstack;
+ uc->uc_stack = tst->altstack;
#define SC(reg) sc->reg = tst->m_##reg
@@ -976,8 +977,8 @@ void vg_push_signal_frame ( ThreadId tid
already using. Logic from get_sigframe in
arch/i386/kernel/signal.c. */
- sas_ss_flags(tst->m_esp) == 0
+ sas_ss_flags(tid, tst->m_esp) == 0
) {
esp_top_of_frame
- = (Addr)(vg_scss.altstack.ss_sp) + vg_scss.altstack.ss_size;
+ = (Addr)(tst->altstack.ss_sp) + tst->altstack.ss_size;
if (VG_(clo_trace_signals))
VG_(message)(Vg_DebugMsg,
@@ -986,5 +987,5 @@ void vg_push_signal_frame ( ThreadId tid
/* Signal delivery to tools */
- VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/False );
+ VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/True );
} else {
@@ -992,5 +993,5 @@ void vg_push_signal_frame ( ThreadId tid
/* Signal delivery to tools */
- VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/True );
+ VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/False );
}
@@ -2338,5 +2339,5 @@ void VG_(sigstartup_actions) ( void )
/* Copy the alt stack, if any. */
- ret = VG_(ksigaltstack)(NULL, &vg_scss.altstack);
+ ret = VG_(ksigaltstack)(NULL, &VG_(threads)[1].altstack);
vg_assert(ret == 0);
@@ -2405,5 +2406,5 @@ void VG_(sigshutdown_actions) ( void )
/* Restore the sig alt stack. */
- ret = VG_(ksigaltstack)(&vg_scss.altstack, NULL);
+ ret = VG_(ksigaltstack)(&VG_(threads)[1].altstack, NULL);
vg_assert(ret == 0);
--- valgrind/coregrind/vg_include.h #1.185:1.186
@@ -845,4 +845,7 @@ typedef
Addr stack_highest_word;
+ /* Alternate signal stack */
+ vki_kstack_t altstack;
+
/* Pointer to this thread's Local (Segment) Descriptor Table.
Starts out as NULL, indicating there is no table, and we hope to
|