PERFORCE change 152515 for review
Peter Wemm
peter at FreeBSD.org
Wed Nov 5 01:45:20 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=152515
Change 152515 by peter at peter_overcee on 2008/11/05 09:44:49
Make libthr threads work. Exiting/shutdown leaves a bit to be desired.
Sometimes everything exits without doing the final error report. I think
this is what happens if the last thread calls thr_exit() after the main
thread has already called exit().
Affected files ...
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-amd64-freebsd.c#8 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#25 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-amd64-freebsd.c#8 (text+ko) ====
@@ -149,6 +149,7 @@
SysRes res;
vki_sigset_t blockall, savedmask;
struct vki_thr_param tp;
+ Addr stk;
PRINT("thr_new ( %#lx, %ld )",ARG1,ARG2);
PRE_REG_READ2(int, "thr_new",
@@ -218,9 +219,22 @@
/* start the thread with everything blocked */
VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
+ /* Set the client state for scheduler to run libthr's trampoline */
+ ctst->arch.vex.guest_RDI = (Addr)tp.arg;
+ ctst->arch.vex.guest_RSP = (Addr)tp.stack_base + tp.stack_size - 8;
+ ctst->arch.vex.guest_RIP = (Addr)tp.start_func;
+ /* But this is for thr_new() to run valgrind's trampoline */
+ tp.start_func = (void *)ML_(start_thread_NORETURN);
+ tp.arg = &VG_(threads)[ctid];
+
+ /* And valgrind's trampoline on its own stack */
+ stk = ML_(allocstack)(ctid);
+ tp.stack_base = (void *)ctst->os_state.valgrind_stack_base;
+ tp.stack_size = (Addr)stk - (Addr)tp.stack_base;
+
/* Create the new thread */
- res = VG_(do_syscall2)(__NR_thr_new, ARG1, ARG2);
+ res = VG_(do_syscall2)(__NR_thr_new, (UWord)&tp, sizeof(tp));
VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
@@ -237,8 +251,11 @@
/* Thread creation was successful; let the child have the chance
to run */
- /* *flags |= SfYieldAfter; */
+ *flags |= SfYieldAfter;
}
+
+ /* "Complete" the syscall so that the wrapper doesn't call the kernel again. */
+ SET_STATUS_from_SysRes(res);
}
PRE(sys_sigreturn)
==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#25 (text+ko) ====
@@ -1761,6 +1761,19 @@
POST_MEM_WRITE( ARG1, sizeof(long));
}
+PRE(sys_thr_exit)
+{
+ ThreadState *tst;
+
+ tst = VG_(get_ThreadState)(tid);
+ tst->exitreason = VgSrc_ExitThread;
+
+ VG_(exit_thread)(tid);
+ PRINT( "sys_thr_exit ( %#lx )", ARG1 );
+ PRE_REG_READ1(long, "thr_exit", long *, "status");
+// PRE_MEM_WRITE( "thr_exit()", ARG1, sizeof(long));
+}
+
PRE(sys_thr_set_name)
{
PRINT( "sys_thr_set_name ( %ld, %#lx )", ARG1, ARG2 );
@@ -3450,7 +3463,7 @@
BSDX_(__NR___acl_aclcheck_link, sys___acl_aclcheck_link), // 428
//!sigwait 429
// thr_create 430
- // thr_exit 431
+ BSDX_(__NR_thr_exit, sys_thr_exit), // 431
BSDXY(__NR_thr_self, sys_thr_self), // 432
// thr_kill 433
More information about the p4-projects
mailing list