Lines Matching refs:pThread

93 static void rtThreadDestroy(PRTTHREADINT pThread);
97 static void rtThreadRemoveLocked(PRTTHREADINT pThread);
263 PRTTHREADINT pThread;
273 pThread = rtThreadAlloc(enmType, fFlags, RTTHREADINT_FLAGS_ALIEN | fIntFlags, pszName);
274 if (pThread)
277 rc = rtThreadNativeAdopt(pThread);
280 rtThreadInsert(pThread, NativeThread);
281 rtThreadSetState(pThread, RTTHREADSTATE_RUNNING);
282 rtThreadRelease(pThread);
295 * @param pThread Where to store the thread handle. Optional.
297 RTDECL(int) RTThreadAdopt(RTTHREADTYPE enmType, unsigned fFlags, const char *pszName, PRTTHREAD pThread)
304 AssertReturn(!pThread || VALID_PTR(pThread), VERR_INVALID_POINTER);
330 if (pThread)
331 *pThread = Thread;
367 PRTTHREADINT pThread = (PRTTHREADINT)RTMemAllocZ(sizeof(RTTHREADINT));
368 if (pThread)
373 pThread->Core.Key = (void*)NIL_RTTHREAD;
374 pThread->u32Magic = RTTHREADINT_MAGIC;
378 memcpy(pThread->szName, pszName, cchName);
379 pThread->szName[cchName] = '\0';
380 pThread->cRefs = 2 + !!(fFlags & RTTHREADFLAGS_WAITABLE); /* And extra reference if waitable. */
381 pThread->rc = VERR_PROCESS_RUNNING; /** @todo get a better error code! */
382 pThread->enmType = enmType;
383 pThread->fFlags = fFlags;
384 pThread->fIntFlags = fIntFlags;
385 pThread->enmState = RTTHREADSTATE_INITIALIZING;
386 pThread->fReallySleeping = false;
388 rtLockValidatorInitPerThread(&pThread->LockValidator);
391 rtStrIconvCacheInit(pThread);
393 rc = RTSemEventMultiCreate(&pThread->EventUser);
396 rc = RTSemEventMultiCreate(&pThread->EventTerminated);
398 return pThread;
399 RTSemEventMultiDestroy(pThread->EventUser);
401 RTMemFree(pThread);
413 * @param pThread Pointer to thread structure allocated by rtThreadAlloc().
416 DECLHIDDEN(void) rtThreadInsert(PRTTHREADINT pThread, RTNATIVETHREAD NativeThread)
418 Assert(pThread);
419 Assert(pThread->u32Magic == RTTHREADINT_MAGIC);
431 if (rtThreadGetState(pThread) != RTTHREADSTATE_TERMINATED)
442 if (pThreadOther != pThread)
448 AssertMsg(pThreadOther->fIntFlags & RTTHREADINT_FLAGS_ALIEN, ("%p:%s; %p:%s\n", pThread, pThread->szName, pThreadOther, pThreadOther->szName));
449 ASMAtomicBitClear(&pThread->fIntFlags, RTTHREADINT_FLAG_IN_TREE_BIT);
456 ASMAtomicWritePtr(&pThread->Core.Key, (void *)NativeThread);
457 fRc = RTAvlPVInsert(&g_ThreadTree, &pThread->Core);
458 ASMAtomicOrU32(&pThread->fIntFlags, RTTHREADINT_FLAG_IN_TREE);
462 AssertReleaseMsg(fRc, ("Lock problem? %p (%RTnthrd) %s\n", pThread, NativeThread, pThread->szName));
476 * @param pThread The thread to remove.
478 static void rtThreadRemoveLocked(PRTTHREADINT pThread)
480 PRTTHREADINT pThread2 = (PRTTHREADINT)RTAvlPVRemove(&g_ThreadTree, pThread->Core.Key);
482 AssertMsg(pThread2 == pThread, ("%p(%s) != %p (%p/%s)\n", pThread2, pThread2 ? pThread2->szName : "<null>",
483 pThread, pThread->Core.Key, pThread->szName));
493 * @param pThread The thread to remove.
495 static void rtThreadRemove(PRTTHREADINT pThread)
498 if (ASMAtomicBitTestAndClear(&pThread->fIntFlags, RTTHREADINT_FLAG_IN_TREE_BIT))
499 rtThreadRemoveLocked(pThread);
510 DECLINLINE(bool) rtThreadIsAlive(PRTTHREADINT pThread)
512 return !(pThread->fIntFlags & RTTHREADINT_FLAGS_TERMINATED);
525 PRTTHREADINT pThread;
530 pThread = (PRTTHREADINT)RTAvlPVGet(&g_ThreadTree, (void *)NativeThread);
532 return pThread;
549 PRTTHREADINT pThread = (PRTTHREADINT)Thread;
550 if ( pThread->u32Magic == RTTHREADINT_MAGIC
551 && pThread->cRefs > 0)
553 ASMAtomicIncU32(&pThread->cRefs);
554 return pThread;
566 * @param pThread The thread structure to release.
568 DECLHIDDEN(uint32_t) rtThreadRelease(PRTTHREADINT pThread)
572 Assert(pThread);
573 if (pThread->cRefs >= 1)
575 cRefs = ASMAtomicDecU32(&pThread->cRefs);
577 rtThreadDestroy(pThread);
591 * @param pThread The thread to destroy.
593 static void rtThreadDestroy(PRTTHREADINT pThread)
605 if (ASMBitTest(&pThread->fIntFlags, RTTHREADINT_FLAG_IN_TREE_BIT))
607 ASMAtomicIncU32(&pThread->cRefs);
608 rtThreadRemove(pThread);
609 ASMAtomicDecU32(&pThread->cRefs);
618 rtLockValidatorDeletePerThread(&pThread->LockValidator);
621 rtStrIconvCacheDestroy(pThread);
623 ASMAtomicXchgU32(&pThread->u32Magic, RTTHREADINT_MAGIC_DEAD);
624 ASMAtomicWritePtr(&pThread->Core.Key, (void *)NIL_RTTHREAD);
625 pThread->enmType = RTTHREADTYPE_INVALID;
626 hEvt1 = pThread->EventUser;
627 pThread->EventUser = NIL_RTSEMEVENTMULTI;
628 hEvt2 = pThread->EventTerminated;
629 pThread->EventTerminated = NIL_RTSEMEVENTMULTI;
642 rtThreadNativeDestroy(pThread);
643 RTMemFree(pThread);
651 * @param pThread The thread structure.
654 DECLHIDDEN(void) rtThreadTerminate(PRTTHREADINT pThread, int rc)
656 Assert(pThread->cRefs >= 1);
662 rtThreadTlsDestruction(pThread);
668 pThread->rc = rc;
669 rtThreadSetState(pThread, RTTHREADSTATE_TERMINATED);
670 ASMAtomicOrU32(&pThread->fIntFlags, RTTHREADINT_FLAGS_TERMINATED);
671 if (pThread->EventTerminated != NIL_RTSEMEVENTMULTI)
672 RTSemEventMultiSignal(pThread->EventTerminated);
678 rtThreadRemove(pThread);
679 rtThreadRelease(pThread);
688 * pThread is dereference by the thread before returning!
689 * @param pThread The thread structure.
693 DECLCALLBACK(DECLHIDDEN(int)) rtThreadMain(PRTTHREADINT pThread, RTNATIVETHREAD NativeThread, const char *pszThreadName)
697 rtThreadInsert(pThread, NativeThread);
698 Log(("rtThreadMain: Starting: pThread=%p NativeThread=%RTnthrd Name=%s pfnThread=%p pvUser=%p\n",
699 pThread, NativeThread, pThread->szName, pThread->pfnThread, pThread->pvUser));
704 rc = rtThreadNativeSetPriority(pThread, pThread->enmType);
707 pThread, NativeThread, pThread->szName, pThread->enmType, g_enmProcessPriority, rc));
710 pThread, NativeThread, pThread->szName, pThread->enmType, rc));
716 rtThreadSetState(pThread, RTTHREADSTATE_RUNNING);
717 rc = pThread->pfnThread(pThread, pThread->pvUser);
723 int32_t cWrite = ASMAtomicReadS32(&pThread->cWriteLocks);
725 int32_t cRead = ASMAtomicReadS32(&pThread->cReadLocks);
729 Log(("rtThreadMain: Terminating: rc=%d pThread=%p NativeThread=%RTnthrd Name=%s pfnThread=%p pvUser=%p\n",
730 rc, pThread, NativeThread, pThread->szName, pThread->pfnThread, pThread->pvUser));
731 rtThreadTerminate(pThread, rc);
740 * @param pThread Where to store the thread handle to the new thread. (optional)
750 RTDECL(int) RTThreadCreate(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,
756 LogFlow(("RTThreadCreate: pThread=%p pfnThread=%p pvUser=%p cbStack=%#x enmType=%d fFlags=%#x pszName=%p:{%s}\n",
757 pThread, pfnThread, pvUser, cbStack, enmType, fFlags, pszName, pszName));
762 if (!VALID_PTR(pThread) && pThread)
764 Assert(VALID_PTR(pThread));
801 if (pThread)
802 *pThread = pThreadInt;
824 * @param pThread See RTThreadCreate.
833 RTDECL(int) RTThreadCreateV(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,
838 return RTThreadCreate(pThread, pfnThread, pvUser, cbStack, enmType, fFlags, szName);
849 * @param pThread See RTThreadCreate.
858 RTDECL(int) RTThreadCreateF(PRTTHREAD pThread, PFNRTTHREAD pfnThread, void *pvUser, size_t cbStack,
864 rc = RTThreadCreateV(pThread, pfnThread, pvUser, cbStack, enmType, fFlags, pszNameFmt, va);
879 PRTTHREADINT pThread = rtThreadGet(Thread);
880 if (pThread)
882 RTNATIVETHREAD NativeThread = (RTNATIVETHREAD)pThread->Core.Key;
883 rtThreadRelease(pThread);
900 PRTTHREADINT pThread = rtThreadGetByNative(NativeThread);
901 if (pThread)
902 return pThread;
919 PRTTHREADINT pThread = rtThreadGet(Thread);
920 if (pThread)
922 const char *szName = pThread->szName;
923 rtThreadRelease(pThread);
941 PRTTHREADINT pThread;
944 pThread = rtThreadGet(Thread);
945 if (pThread)
947 const char *szName = pThread->szName;
948 rtThreadRelease(pThread);
968 PRTTHREADINT pThread;
975 pThread = rtThreadGet(Thread);
976 if (!pThread)
982 pThread->szName[cchName] = '\0'; /* paranoia */
983 memcpy(pThread->szName, pszName, cchName);
984 rtThreadRelease(pThread);
1004 PRTTHREADINT pThread = rtThreadGet(hThread);
1005 if (pThread)
1007 bool fRc = !!(pThread->fIntFlags & RTTHREADINT_FLAGS_MAIN);
1008 rtThreadRelease(pThread);
1065 PRTTHREADINT pThread = rtThreadGet(Thread);
1066 if (pThread)
1068 rc = RTSemEventMultiSignal(pThread->EventUser);
1069 rtThreadRelease(pThread);
1089 PRTTHREADINT pThread = rtThreadGet(Thread);
1090 if (pThread)
1092 rc = RTSemEventMultiWait(pThread->EventUser, cMillies);
1093 rtThreadRelease(pThread);
1113 PRTTHREADINT pThread = rtThreadGet(Thread);
1114 if (pThread)
1116 rc = RTSemEventMultiWaitNoResume(pThread->EventUser, cMillies);
1117 rtThreadRelease(pThread);
1135 PRTTHREADINT pThread = rtThreadGet(Thread);
1136 if (pThread)
1138 rc = RTSemEventMultiReset(pThread->EventUser);
1139 rtThreadRelease(pThread);
1163 PRTTHREADINT pThread = rtThreadGet(Thread);
1164 if (pThread)
1166 if (pThread->fFlags & RTTHREADFLAGS_WAITABLE)
1169 rc = RTSemEventMultiWait(pThread->EventTerminated, cMillies);
1171 rc = RTSemEventMultiWaitNoResume(pThread->EventTerminated, cMillies);
1175 *prc = pThread->rc;
1182 if (ASMAtomicBitTestAndClear(&pThread->fFlags, RTTHREADFLAGS_WAITABLE_BIT))
1184 rtThreadRelease(pThread);
1192 && ASMAtomicReadU32(&pThread->cRefs) > 1)
1193 rtThreadNativeWaitKludge(pThread);
1203 rtThreadRelease(pThread);
1261 PRTTHREADINT pThread = rtThreadGet(Thread);
1262 if (pThread)
1264 if (rtThreadIsAlive(pThread))
1270 rc = rtThreadNativeSetPriority(pThread, enmType);
1272 ASMAtomicXchgSize(&pThread->enmType, enmType);
1275 Log(("RTThreadSetType: failed on thread %p (%s), rc=%Rrc!!!\n", Thread, pThread->szName, rc));
1279 rtThreadRelease(pThread);
1304 PRTTHREADINT pThread = rtThreadGet(Thread);
1305 if (pThread)
1307 enmType = pThread->enmType;
1308 rtThreadRelease(pThread);
1346 PRTTHREADINT pThread = (PRTTHREADINT)pNode;
1347 if (!rtThreadIsAlive(pThread))
1349 int rc = rtThreadNativeSetPriority(pThread, pThread->enmType);
1411 PRTTHREADINT pThread = hThread;
1412 if (pThread != NIL_RTTHREAD)
1414 Assert(pThread == RTThreadSelf());
1415 if (rtThreadGetState(pThread) == RTTHREADSTATE_RUNNING)
1416 rtThreadSetState(pThread, enmState);
1417 ASMAtomicWriteBool(&pThread->fReallySleeping, fReallySleeping);
1434 PRTTHREADINT pThread = hThread;
1435 if (pThread != NIL_RTTHREAD)
1437 Assert(pThread == RTThreadSelf());
1438 ASMAtomicWriteBool(&pThread->fReallySleeping, false);
1440 RTTHREADSTATE enmActualState = rtThreadGetState(pThread);
1443 rtThreadSetState(pThread, RTTHREADSTATE_RUNNING);
1444 if ( pThread->LockValidator.pRec
1445 && pThread->LockValidator.enmRecState == enmCurState)
1446 ASMAtomicWriteNullPtr(&pThread->LockValidator.pRec);
1451 && pThread->LockValidator.pRec)
1452 ASMAtomicWriteNullPtr(&pThread->LockValidator.pRec);
1453 Assert( pThread->LockValidator.pRec == NULL
1469 PRTTHREADINT pThread = rtThreadGet(hThread);
1470 if (pThread)
1472 enmState = rtThreadGetState(pThread);
1473 rtThreadRelease(pThread);
1483 PRTTHREADINT pThread = rtThreadGet(hThread);
1484 if (pThread)
1486 enmState = rtThreadGetState(pThread);
1487 if (!ASMAtomicUoReadBool(&pThread->fReallySleeping))
1489 rtThreadRelease(pThread);
1536 PRTTHREADINT pThread = (PRTTHREADINT)pNode;
1538 ASMAtomicWriteNullPtr(&pThread->apvTlsEntries[iTls]);
1566 PRTTHREADINT pThread = (PRTTHREADINT)pNode;
1567 rtThreadNativeInformDebugger(pThread);