|
From: <sv...@va...> - 2009-04-01 19:49:31
|
Author: sewardj
Date: 2009-04-01 20:48:42 +0100 (Wed, 01 Apr 2009)
New Revision: 9507
Log:
pthread_hijack, wqthread_hijack: start these threads with the correct
signal mask (everything blocked).
Modified:
branches/DARWIN/coregrind/m_syswrap/syswrap-x86-darwin.c
Modified: branches/DARWIN/coregrind/m_syswrap/syswrap-x86-darwin.c
===================================================================
--- branches/DARWIN/coregrind/m_syswrap/syswrap-x86-darwin.c 2009-04-01 16:17:01 UTC (rev 9506)
+++ branches/DARWIN/coregrind/m_syswrap/syswrap-x86-darwin.c 2009-04-01 19:48:42 UTC (rev 9507)
@@ -275,6 +275,7 @@
void pthread_hijack(Addr self, Addr kport, Addr func, Addr func_arg,
Addr stacksize, Addr flags, Addr sp)
{
+ vki_sigset_t blockall;
ThreadState *tst = (ThreadState *)func_arg;
VexGuestX86State *vex = &tst->arch.vex;
@@ -284,6 +285,11 @@
// The parent thread holds V's lock on our behalf.
semaphore_wait(tst->os_state.child_go);
+ /* Start the thread with all signals blocked. VG_(scheduler) will
+ set the mask correctly when we finally get there. */
+ VG_(sigfillset)(&blockall);
+ VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, NULL);
+
// Set thread's registers
// Do this FIRST because some code below tries to collect a backtrace,
// which requires valid register data.
@@ -377,6 +383,7 @@
VexGuestX86State *vex;
Addr stack;
SizeT stacksize;
+ vki_sigset_t blockall;
/* When we enter here we hold no lock (!), so we better acquire it
pronto. Why do we hold no lock? Because (presumably) the only
@@ -388,6 +395,11 @@
lock. */
VG_(acquire_BigLock_LL)("wqthread_hijack");
+ /* Start the thread with all signals blocked. VG_(scheduler) will
+ set the mask correctly when we finally get there. */
+ VG_(sigfillset)(&blockall);
+ VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, NULL);
+
if (reuse) {
// This thread already exists; we're merely re-entering
// after leaving via workq_ops(WQOPS_THREAD_RETURN).
|