|
From: Jeremy F. <je...@go...> - 2003-11-09 09:57:00
|
CVS commit by fitzhardinge:
Only set the thread's status to WaitSys if we're actually waiting for
a proxyLWP to complete a syscall.
Update sigaltstack test to use mmap to allocate the stack.
M +7 -5 coregrind/vg_syscalls.c 1.54
M +5 -3 memcheck/tests/sigaltstack.c 1.3
--- valgrind/coregrind/vg_syscalls.c #1.53:1.54
@@ -4392,8 +4392,6 @@ Bool VG_(pre_syscall) ( ThreadId tid )
*/
- /* post_syscall expects us to be "waiting" even if we don't
- block */
tst->syscallno = syscallno;
- tst->status = VgTs_WaitSys;
+ vg_assert(tst->status == VgTs_Runnable);
if (syscallno < MAX_SPECIAL_SYS && special_sys[syscallno].before != NULL) {
@@ -4455,4 +4453,9 @@ Bool VG_(pre_syscall) ( ThreadId tid )
VGP_POPCC(VgpCoreSysWrap);
+ /* If we're waiting on the syscall because it's in the hands of the
+ ProxyLWP, then set the thread state to WaitSys. */
+ if (!syscall_done)
+ tst->status = VgTs_WaitSys;
+
return syscall_done;
}
@@ -4478,5 +4481,4 @@ void VG_(post_syscall) ( ThreadId tid )
vg_assert(syscallno != -1); /* must be a current syscall */
- vg_assert(tst->status == VgTs_WaitSys); /* should be blocked waiting */
if (syscallno < MAX_SPECIAL_SYS && special_sys[syscallno].before != NULL) {
--- valgrind/memcheck/tests/sigaltstack.c #1.2:1.3
@@ -4,4 +4,5 @@
#include <malloc.h>
#include <signal.h>
+#include <sys/mman.h>
void sig_handler(int sig){
@@ -15,7 +15,9 @@ int main(int argv, char** argc) {
stack_t sigstk;
struct sigaction act;
- sigstk.ss_sp = (char *)malloc(SIGSTKSZ);
+ static const int size = SIGSTKSZ;
+ char *stk = (char *)mmap(0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+ sigstk.ss_sp = stk;
- sigstk.ss_size = SIGSTKSZ;
+ sigstk.ss_size = size;
sigstk.ss_flags = 0;
fprintf(stderr, "calling sigaltstack, stack base is %p\n", sigstk.ss_sp);
|