Changeset 25436 in vbox
- Timestamp:
- Dec 16, 2009 3:22:40 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56085
- Location:
- trunk/src/VBox/Runtime
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/misc/lockvalidator.cpp
r25409 r25436 56 56 * Global Variables * 57 57 *******************************************************************************/ 58 58 /** Serializing object destruction and deadlock detection. 59 * NS: RTLOCKVALIDATORREC and RTTHREADINT destruction. 60 * EW: Deadlock detection. 61 */ 62 static RTSEMXROADS g_hLockValidatorXRoads = NIL_RTSEMXROADS; 63 64 65 66 /** 67 * Serializes destruction of RTLOCKVALIDATORREC and RTTHREADINT structures. 68 */ 69 DECLHIDDEN(void) rtLockValidatorSerializeDestructEnter(void) 70 { 71 RTSEMXROADS hXRoads = g_hLockValidatorXRoads; 72 if (hXRoads != NIL_RTSEMXROADS) 73 RTSemXRoadsNSEnter(hXRoads); 74 } 75 76 77 /** 78 * Call after rtLockValidatorSerializeDestructEnter. 79 */ 80 DECLHIDDEN(void) rtLockValidatorSerializeDestructLeave(void) 81 { 82 RTSEMXROADS hXRoads = g_hLockValidatorXRoads; 83 if (hXRoads != NIL_RTSEMXROADS) 84 RTSemXRoadsNSLeave(hXRoads); 85 } 86 87 88 /** 89 * Serializes deadlock detection against destruction of the objects being 90 * inspected. 91 */ 92 DECLINLINE(void) rtLockValidatorSerializeDetectionEnter(void) 93 { 94 RTSEMXROADS hXRoads = g_hLockValidatorXRoads; 95 if (hXRoads != NIL_RTSEMXROADS) 96 RTSemXRoadsEWEnter(hXRoads); 97 } 98 99 100 /** 101 * Call after rtLockValidatorSerializeDetectionEnter. 102 */ 103 DECLHIDDEN(void) rtLockValidatorSerializeDetectionLeave(void) 104 { 105 RTSEMXROADS hXRoads = g_hLockValidatorXRoads; 106 if (hXRoads != NIL_RTSEMXROADS) 107 RTSemXRoadsEWLeave(hXRoads); 108 } 59 109 60 110 … … 74 124 pRec->hLock = hLock; 75 125 pRec->pszName = pszName; 126 127 /* Lazily initialize the crossroads semaphore. */ 128 static uint32_t volatile s_fInitializing = false; 129 if (RT_UNLIKELY( g_hLockValidatorXRoads == NIL_RTSEMXROADS 130 && ASMAtomicCmpXchgU32(&s_fInitializing, true, false))) 131 { 132 RTSEMXROADS hXRoads; 133 int rc = RTSemXRoadsCreate(&hXRoads); 134 if (RT_SUCCESS(rc)) 135 ASMAtomicWriteHandle(&g_hLockValidatorXRoads, hXRoads); 136 ASMAtomicWriteU32(&s_fInitializing, false); 137 } 76 138 } 77 139 78 140 79 141 RTDECL(int) RTLockValidatorCreate(PRTLOCKVALIDATORREC *ppRec, RTLOCKVALIDATORCLASS hClass, 80 142 uint32_t uSubClass, const char *pszName, void *pvLock) 81 143 { 82 144 PRTLOCKVALIDATORREC pRec; … … 95 157 Assert(pRec->u32Magic == RTLOCKVALIDATORREC_MAGIC); 96 158 159 rtLockValidatorSerializeDestructEnter(); 160 97 161 ASMAtomicWriteU32(&pRec->u32Magic, RTLOCKVALIDATORREC_MAGIC_DEAD); 98 162 ASMAtomicWriteHandle(&pRec->hThread, NIL_RTTHREAD); 99 163 ASMAtomicWriteHandle(&pRec->hClass, NIL_RTLOCKVALIDATORCLASS); 164 165 rtLockValidatorSerializeDestructLeave(); 100 166 } 101 167 … … 413 479 * races on SMP boxes. 414 480 */ 481 rtLockValidatorSerializeDetectionEnter(); 482 415 483 PRTTHREADINT pCur; 416 484 unsigned cPrevLength = ~0U; … … 466 534 pCur = pNext; 467 535 if (!pCur) 536 { 537 rtLockValidatorSerializeDetectionLeave(); 468 538 return; 539 } 469 540 470 541 /* … … 500 571 */ 501 572 rtLockValidatorComplainAboutDeadlock(pRec, pThread, enmState, pCur, uId, RT_SRC_POS_ARGS); 573 574 rtLockValidatorSerializeDetectionLeave(); 502 575 } 503 576 } -
trunk/src/VBox/Runtime/common/misc/thread.cpp
r25409 r25436 577 577 ASMAtomicDecU32(&pThread->cRefs); 578 578 } 579 580 /* 581 * Invalidate the thread structure and free it. 582 */ 583 #ifdef IN_RING3 584 rtLockValidatorSerializeDestructEnter(); 585 #endif 586 579 587 ASMAtomicXchgU32(&pThread->u32Magic, RTTHREADINT_MAGIC_DEAD); 580 581 /*582 * Free resources.583 */584 588 ASMAtomicWritePtr(&pThread->Core.Key, (void *)NIL_RTTHREAD); 585 pThread->enmType = RTTHREADTYPE_INVALID; 586 RTSemEventMultiDestroy(pThread->EventUser); 587 pThread->EventUser = NIL_RTSEMEVENTMULTI; 588 if (pThread->EventTerminated != NIL_RTSEMEVENTMULTI) 589 { 590 RTSemEventMultiDestroy(pThread->EventTerminated); 591 pThread->EventTerminated = NIL_RTSEMEVENTMULTI; 592 } 589 pThread->enmType = RTTHREADTYPE_INVALID; 590 RTSEMEVENTMULTI hEvt1 = pThread->EventUser; 591 pThread->EventUser = NIL_RTSEMEVENTMULTI; 592 RTSEMEVENTMULTI hEvt2 = pThread->EventTerminated; 593 pThread->EventTerminated = NIL_RTSEMEVENTMULTI; 594 593 595 RTMemFree(pThread); 596 597 #ifdef IN_RING3 598 rtLockValidatorSerializeDestructLeave(); 599 #endif 600 601 /* 602 * Destroy semaphore resources. 603 */ 604 RTSemEventMultiDestroy(hEvt1); 605 if (hEvt2 != NIL_RTSEMEVENTMULTI) 606 RTSemEventMultiDestroy(hEvt2); 594 607 } 595 608 -
trunk/src/VBox/Runtime/include/internal/lockvalidator.h
r25406 r25436 63 63 } RTLOCKVALIDATORPERTHREAD; 64 64 65 66 DECLHIDDEN(void) rtLockValidatorSerializeDestructEnter(void); 67 DECLHIDDEN(void) rtLockValidatorSerializeDestructLeave(void); 68 65 69 RT_C_DECLS_END 66 70 -
trunk/src/VBox/Runtime/testcase/tstRTSemXRoads.cpp
r25431 r25436 80 80 } 81 81 82 82 83 static DECLCALLBACK(int) tstTrafficNSThread(RTTHREAD hSelf, void *pvUser) 83 84 {
Note:
See TracChangeset
for help on using the changeset viewer.