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 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/core.h b/coregrind/core.h
index 4921efd..eff0df0 100644
--- a/coregrind/core.h
+++ b/coregrind/core.h
@@ -1325,7 +1325,7 @@
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 83ee91d..5c92166 100644
--- a/coregrind/vg_proxylwp.c
+++ b/coregrind/vg_proxylwp.c
@@ -725,11 +725,14 @@
}
/* 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 @@
/* 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 ffb09d7..00a7ed7 100644
--- a/coregrind/vg_scheduler.c
+++ b/coregrind/vg_scheduler.c
@@ -2689,7 +2689,7 @@
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 044e3b0..4613afd 100644
--- a/coregrind/vg_signals.c
+++ b/coregrind/vg_signals.c
@@ -1977,7 +1977,8 @@
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);
}
}