From: Julian Seward Date: Mon, 2 Sep 2013 13:02:58 +0000 (+0000) Subject: Make wqthread_hijack work with the OSX 10.8 kernel. X-Git-Tag: svn/VALGRIND_3_9_0~168 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=187c2be40d89bb5d20b171021cc6e4b855d644d1;p=thirdparty%2Fvalgrind.git Make wqthread_hijack work with the OSX 10.8 kernel. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13523 --- diff --git a/coregrind/m_syswrap/syswrap-amd64-darwin.c b/coregrind/m_syswrap/syswrap-amd64-darwin.c index ec1ea01689..bef016302b 100644 --- a/coregrind/m_syswrap/syswrap-amd64-darwin.c +++ b/coregrind/m_syswrap/syswrap-amd64-darwin.c @@ -432,16 +432,27 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, lock. */ VG_(acquire_BigLock_LL)("wqthread_hijack"); - if (0) VG_(printf)("wqthread_hijack: self %#lx, kport %#lx, " - "stackaddr %#lx, workitem %#lx, reuse %d, sp %#lx\n", - self, kport, stackaddr, workitem, reuse, sp); + if (0) VG_(printf)( + "wqthread_hijack: self %#lx, kport %#lx, " + "stackaddr %#lx, workitem %#lx, reuse/flags %x, sp %#lx\n", + self, kport, stackaddr, workitem, reuse, sp); /* 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) { + /* For 10.7 and earlier, |reuse| appeared to be used as a simple + boolean. In 10.8 and later its name changed to |flags| and has + various other bits OR-d into it too, so it's necessary to fish + out just the relevant parts. Hence: */ +# if DARWIN_VERS <= DARWIN_10_7 + Bool is_reuse = reuse != 0; +# elif DARWIN_VERS == DARWIN_10_8 + Bool is_reuse = (reuse & 0x20000 /* == WQ_FLAG_THREAD_REUSE */) != 0; +# endif + + if (is_reuse) { /* For whatever reason, tst->os_state.pthread appear to have a constant offset of 96 on 10.7, but zero on 10.6 and 10.5. No @@ -493,7 +504,7 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, stacksize = 512*1024; // wq stacks are always DEFAULT_STACK_SIZE stack = VG_PGROUNDUP(sp) - stacksize; - if (reuse) { + if (is_reuse) { // Continue V's thread back in the scheduler. // The client thread is of course in another location entirely.