void WINAPI NaClAppThreadLauncher(void *state) { struct NaClAppThread *natp = (struct NaClAppThread *) state; uint32_t thread_idx; NaClLog(4, "NaClAppThreadLauncher: entered\n"); NaClSignalStackRegister(natp->signal_stack); NaClLog(4, " natp = 0x%016"NACL_PRIxPTR"\n", (uintptr_t) natp); NaClLog(4, " prog_ctr = 0x%016"NACL_PRIxNACL_REG"\n", natp->user.prog_ctr); NaClLog(4, "stack_ptr = 0x%016"NACL_PRIxPTR"\n", NaClGetThreadCtxSp(&natp->user)); thread_idx = NaClGetThreadIdx(natp); CHECK(0 < thread_idx); CHECK(thread_idx < NACL_THREAD_MAX); NaClTlsSetCurrentThread(natp); nacl_user[thread_idx] = &natp->user; #if NACL_WINDOWS nacl_thread_ids[thread_idx] = GetCurrentThreadId(); #elif NACL_OSX NaClSetCurrentMachThreadForThreadIndex(thread_idx); #endif /* * We have to hold the threads_mu lock until after thread_num field * in this thread has been initialized. All other threads can only * find and examine this natp through the threads table, so the fact * that natp is not consistent (no thread_num) will not be visible. */ NaClXMutexLock(&natp->nap->threads_mu); natp->thread_num = NaClAddThreadMu(natp->nap, natp); NaClXMutexUnlock(&natp->nap->threads_mu); NaClVmHoleThreadStackIsSafe(natp->nap); NaClStackSafetyNowOnUntrustedStack(); /* * Notify the debug stub, that a new thread is availible. */ if (NULL != natp->nap->debug_stub_callbacks) { natp->nap->debug_stub_callbacks->thread_create_hook(natp); } /* * After this NaClAppThreadSetSuspendState() call, we should not * claim any mutexes, otherwise we risk deadlock. */ NaClAppThreadSetSuspendState(natp, NACL_APP_THREAD_TRUSTED, NACL_APP_THREAD_UNTRUSTED); NaClStartThreadInApp(natp, natp->user.prog_ctr); }
void WINAPI NaClThreadLauncher(void *state) { struct NaClAppThread *natp = (struct NaClAppThread *) state; NaClLog(4, "NaClThreadLauncher: entered\n"); NaClSignalStackRegister(natp->signal_stack); NaClLog(4, " natp = 0x%016"NACL_PRIxPTR"\n", (uintptr_t) natp); NaClLog(4, " prog_ctr = 0x%016"NACL_PRIxNACL_REG"\n", natp->user.prog_ctr); NaClLog(4, "stack_ptr = 0x%016"NACL_PRIxPTR"\n", NaClGetThreadCtxSp(&natp->user)); NaClTlsSetIdx(NaClGetThreadIdx(natp)); /* * We have to hold the threads_mu lock until after thread_num field * in this thread has been initialized. All other threads can only * find and examine this natp through the threads table, so the fact * that natp is not consistent (no thread_num) will not be visible. */ NaClXMutexLock(&natp->nap->threads_mu); natp->thread_num = NaClAddThreadMu(natp->nap, natp); NaClXMutexUnlock(&natp->nap->threads_mu); /* * Notify the debug stub, that a new thread is availible. */ NaClDebugThreadPrepDebugging(natp); /* * We need to set an exception handler in every thread we start, * otherwise the system's default handler is called and a message box is * shown. */ WINDOWS_EXCEPTION_TRY; NaClStartThreadInApp(natp, natp->user.prog_ctr); WINDOWS_EXCEPTION_CATCH; }