From: Julian Seward Date: Wed, 24 Nov 2004 21:24:24 +0000 (+0000) Subject: Fix another potentially-failing use of get_current_tid(), in X-Git-Tag: svn/VALGRIND_3_0_0~1218 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f22c255940ec0fc8d9a8cff6c9bdecf3c8800a54;p=thirdparty%2Fvalgrind.git Fix another potentially-failing use of get_current_tid(), in proxy_sendsig(). Fixes the pth_blockesig regression test. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3100 --- diff --git a/coregrind/core.h b/coregrind/core.h index 4921efd414..eff0df0044 100644 --- a/coregrind/core.h +++ b/coregrind/core.h @@ -1325,7 +1325,7 @@ extern void VG_(proxy_init) ( void ); extern void VG_(proxy_create) ( ThreadId tid ); extern void VG_(proxy_delete) ( ThreadId tid, Bool force ); extern void VG_(proxy_results) ( void ); -extern void VG_(proxy_sendsig) ( ThreadId tid, Int signo ); +extern void VG_(proxy_sendsig) ( ThreadId fromTid, ThreadId toTid, Int signo ); extern void VG_(proxy_setsigmask)(ThreadId tid); extern void VG_(proxy_sigack) ( ThreadId tid, const vki_sigset_t *); extern void VG_(proxy_abort_syscall) ( ThreadId tid ); diff --git a/coregrind/vg_proxylwp.c b/coregrind/vg_proxylwp.c index 83ee91da7f..5c92166e83 100644 --- a/coregrind/vg_proxylwp.c +++ b/coregrind/vg_proxylwp.c @@ -725,11 +725,14 @@ static Int proxylwp(void *v) } /* Send a signal to a proxy LWP */ -void VG_(proxy_sendsig)(ThreadId tid, Int sig) +void VG_(proxy_sendsig)(ThreadId fromTid, ThreadId toTid, Int sig) { - ThreadState *tst = VG_(get_ThreadState)(tid); - ProxyLWP *proxy = tst->proxy; - Int lwp; + /* toTid must be genuine, but fromTid can be + VG_INVALID_THREADID. */ + ThreadState* tst = VG_(get_ThreadState)(toTid); + ProxyLWP* proxy = tst->proxy; + Bool signallingMyself; + Int lwp; if (proxy == NULL) return; @@ -748,18 +751,22 @@ void VG_(proxy_sendsig)(ThreadId tid, Int sig) /* If a thread is sending a signal to itself and the signal isn't blocked (ie, it will be delivered), wait until the signal message gets sent back, thus making the signal synchronous. */ + signallingMyself + = fromTid != VG_INVALID_THREADID + && fromTid == toTid; + if (sig != 0 && !VG_(is_sig_ign)(sig) && - tid == VG_(get_current_tid)() && + signallingMyself && !VG_(sigismember)(&tst->eff_sig_mask, sig)) { /* If the LWP is actually blocked in a sigtimedwait, then it will eat the signal rather than make it pending and deliver it by the normal mechanism. In this case, just wait for the syscall to dinish. */ if (tst->status == VgTs_WaitSys && tst->syscallno == __NR_rt_sigtimedwait) - sys_wait_results(True, tid, PX_RunSyscall, True); + sys_wait_results(True, toTid, PX_RunSyscall, True); else - sys_wait_results(True, tid, PX_Signal, True); + sys_wait_results(True, toTid, PX_Signal, True); } } diff --git a/coregrind/vg_scheduler.c b/coregrind/vg_scheduler.c index ffb09d7bdc..00a7ed7b7b 100644 --- a/coregrind/vg_scheduler.c +++ b/coregrind/vg_scheduler.c @@ -2689,7 +2689,7 @@ void do_pthread_kill ( ThreadId tid, /* me */ tst = VG_(get_ThreadState)(thread); vg_assert(NULL != tst->proxy); - VG_(proxy_sendsig)(thread, sig); + VG_(proxy_sendsig)(tid/*from*/, thread/*to*/, sig); SET_PTHREQ_RETVAL(tid, 0); } diff --git a/coregrind/vg_signals.c b/coregrind/vg_signals.c index 044e3b0fd0..4613afd957 100644 --- a/coregrind/vg_signals.c +++ b/coregrind/vg_signals.c @@ -1977,7 +1977,8 @@ void VG_(route_signals)(void) tst->sigqueue[tst->sigqueue_head] = siset[sigNo]; tst->sigqueue_head = (tst->sigqueue_head + 1) % VG_N_SIGNALQUEUE; vg_assert(tst->sigqueue_head != tst->sigqueue_tail); - VG_(proxy_sendsig)(target, sigNo); + VG_(proxy_sendsig)(VG_INVALID_THREADID/*from*/, + target/*to*/, sigNo); VG_(sigdelset)(&proc_pending, sigNo); } }