/** * Wrapper which unpacks the params and calls thread function. */ static void rtThreadNativeMain(void *pvArgs) { /* * Block SIGALRM - required for timer-posix.cpp. * This is done to limit harm done by OSes which doesn't do special SIGALRM scheduling. * It will not help much if someone creates threads directly using pthread_create. :/ */ sigset_t SigSet; sigemptyset(&SigSet); sigaddset(&SigSet, SIGALRM); sigprocmask(SIG_BLOCK, &SigSet, NULL); /* * Call common main. */ PRTTHREADINT pThread = (PRTTHREADINT)pvArgs; *g_ppCurThread = pThread; #ifdef fibGetTidPid rtThreadMain(pThread, fibGetTidPid(), &pThread->szName[0]); #else rtThreadMain(pThread, _gettid(), &pThread->szName[0]); #endif *g_ppCurThread = NULL; _endthread(); }
/** * Native kernel thread wrapper function. * * This will forward to rtThreadMain and do termination upon return. * * @param pvArg Pointer to the argument package. */ static VOID __stdcall rtThreadNativeMain(PVOID pvArg) { PETHREAD Self = PsGetCurrentThread(); PRTTHREADINT pThread = (PRTTHREADINT)pvArg; rtThreadMain(pThread, (RTNATIVETHREAD)Self, &pThread->szName[0]); ObDereferenceObject(Self); /* the rtThreadNativeCreate ref. */ }
/** * Native kernel thread wrapper function. * * This will forward to rtThreadMain and do termination upon return. * * @param pvArg Pointer to the argument package. * @param Ignored Wait result, which we ignore. */ static void rtThreadNativeMain(void *pvArg, wait_result_t Ignored) { const thread_t Self = current_thread(); PRTTHREADINT pThread = (PRTTHREADINT)pvArg; rtThreadMain(pThread, (RTNATIVETHREAD)Self, &pThread->szName[0]); kern_return_t kr = thread_terminate(Self); AssertFatalMsgFailed(("kr=%d\n", kr)); }
/** * Wrapper which unpacks the params and calls thread function. */ static void rtThreadNativeMain(void *pvArgs) { rtThreadOs2BlockSigAlarm(); /* * Call common main. */ PRTTHREADINT pThread = (PRTTHREADINT)pvArgs; *g_ppCurThread = pThread; #ifdef fibGetTidPid rtThreadMain(pThread, fibGetTidPid(), &pThread->szName[0]); #else rtThreadMain(pThread, _gettid(), &pThread->szName[0]); #endif *g_ppCurThread = NULL; _endthread(); }
/** * Native thread main function. * * @param pvThreadInt The thread structure. */ static void rtThreadNativeMain(void *pvThreadInt) { PRTTHREADINT pThreadInt = (PRTTHREADINT)pvThreadInt; AssertCompile(sizeof(kt_did_t) == sizeof(pThreadInt->tid)); uint64_t *pu64ThrId = SOL_THREAD_ID_PTR; pThreadInt->tid = *pu64ThrId; rtThreadMain(pThreadInt, RTThreadNativeSelf(), &pThreadInt->szName[0]); thread_exit(); }
/** * Native kernel thread wrapper function. * * This will forward to rtThreadMain and do termination upon return. * * @param pvArg Pointer to the argument package. * @param Ignored Wait result, which we ignore. */ static status_t rtThreadNativeMain(void *pvArg) { const thread_id Self = find_thread(NULL); PRTTHREADINT pThread = (PRTTHREADINT)pvArg; int rc = rtThreadMain(pThread, (RTNATIVETHREAD)Self, &pThread->szName[0]); if (rc < 0) return RTErrConvertFromHaikuKernReturn(rc); return rc; }
/** * Wrapper which unpacks the params and calls thread function. */ static void *rtThreadNativeMain(void *pvArgs) { PRTTHREADINT pThread = (PRTTHREADINT)pvArgs; pthread_t Self = pthread_self(); Assert((uintptr_t)Self == (RTNATIVETHREAD)Self && (uintptr_t)Self != NIL_RTNATIVETHREAD); #if defined(RT_OS_LINUX) /* * Set the TID. */ pThread->tid = syscall(__NR_gettid); ASMMemoryFence(); #endif /* * Block SIGALRM - required for timer-posix.cpp. * This is done to limit harm done by OSes which doesn't do special SIGALRM scheduling. * It will not help much if someone creates threads directly using pthread_create. :/ */ sigset_t SigSet; sigemptyset(&SigSet); sigaddset(&SigSet, SIGALRM); sigprocmask(SIG_BLOCK, &SigSet, NULL); #ifdef RTTHREAD_POSIX_WITH_POKE if (g_iSigPokeThread != -1) siginterrupt(g_iSigPokeThread, 1); #endif /* * Set the TLS entry and, if possible, the thread name. */ int rc = pthread_setspecific(g_SelfKey, pThread); AssertReleaseMsg(!rc, ("failed to set self TLS. rc=%d thread '%s'\n", rc, pThread->szName)); #ifdef IPRT_MAY_HAVE_PTHREAD_SET_NAME_NP if (g_pfnThreadSetName) # ifdef RT_OS_DARWIN g_pfnThreadSetName(pThread->szName); # else g_pfnThreadSetName(Self, pThread->szName); # endif #endif /* * Call common main. */ rc = rtThreadMain(pThread, (uintptr_t)Self, &pThread->szName[0]); pthread_setspecific(g_SelfKey, NULL); pthread_exit((void *)(intptr_t)rc); return (void *)(intptr_t)rc; }
/** * Native thread main function. * * @param pvThreadInt The thread structure. */ static void rtThreadNativeMain(void *pvThreadInt) { const struct thread *Self = curthread; PRTTHREADINT pThreadInt = (PRTTHREADINT)pvThreadInt; int rc; rc = rtThreadMain(pThreadInt, (RTNATIVETHREAD)Self, &pThreadInt->szName[0]); #if __FreeBSD_version >= 800002 kproc_exit(rc); #else kthread_exit(rc); #endif }