VirtualBox

Changeset 25436 in vbox


Ignore:
Timestamp:
Dec 16, 2009 3:22:40 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
56085
Message:

RTLockValidator,RTThread: Serialize deadlock detection and RTTHREAD/RTLOCKVALIDATORREC destruction.

Location:
trunk/src/VBox/Runtime
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/misc/lockvalidator.cpp

    r25409 r25436  
    5656*   Global Variables                                                           *
    5757*******************************************************************************/
    58 
     58/** Serializing object destruction and deadlock detection.
     59 * NS: RTLOCKVALIDATORREC and RTTHREADINT destruction.
     60 * EW: Deadlock detection.
     61 */
     62static RTSEMXROADS g_hLockValidatorXRoads = NIL_RTSEMXROADS;
     63
     64
     65
     66/**
     67 * Serializes destruction of RTLOCKVALIDATORREC and RTTHREADINT structures.
     68 */
     69DECLHIDDEN(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 */
     80DECLHIDDEN(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 */
     92DECLINLINE(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 */
     103DECLHIDDEN(void) rtLockValidatorSerializeDetectionLeave(void)
     104{
     105    RTSEMXROADS hXRoads = g_hLockValidatorXRoads;
     106    if (hXRoads != NIL_RTSEMXROADS)
     107        RTSemXRoadsEWLeave(hXRoads);
     108}
    59109
    60110
     
    74124    pRec->hLock         = hLock;
    75125    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    }
    76138}
    77139
    78140
    79141RTDECL(int)  RTLockValidatorCreate(PRTLOCKVALIDATORREC *ppRec, RTLOCKVALIDATORCLASS hClass,
    80                                    uint32_t uSubClass, const char *pszName, void *pvLock)
     142                                  uint32_t uSubClass, const char *pszName, void *pvLock)
    81143{
    82144    PRTLOCKVALIDATORREC pRec;
     
    95157    Assert(pRec->u32Magic == RTLOCKVALIDATORREC_MAGIC);
    96158
     159    rtLockValidatorSerializeDestructEnter();
     160
    97161    ASMAtomicWriteU32(&pRec->u32Magic, RTLOCKVALIDATORREC_MAGIC_DEAD);
    98162    ASMAtomicWriteHandle(&pRec->hThread, NIL_RTTHREAD);
    99163    ASMAtomicWriteHandle(&pRec->hClass, NIL_RTLOCKVALIDATORCLASS);
     164
     165    rtLockValidatorSerializeDestructLeave();
    100166}
    101167
     
    413479         * races on SMP boxes.
    414480         */
     481        rtLockValidatorSerializeDetectionEnter();
     482
    415483        PRTTHREADINT    pCur;
    416484        unsigned        cPrevLength = ~0U;
     
    466534                pCur = pNext;
    467535                if (!pCur)
     536                {
     537                    rtLockValidatorSerializeDetectionLeave();
    468538                    return;
     539                }
    469540
    470541                /*
     
    500571         */
    501572        rtLockValidatorComplainAboutDeadlock(pRec, pThread, enmState, pCur, uId, RT_SRC_POS_ARGS);
     573
     574        rtLockValidatorSerializeDetectionLeave();
    502575    }
    503576}
  • trunk/src/VBox/Runtime/common/misc/thread.cpp

    r25409 r25436  
    577577        ASMAtomicDecU32(&pThread->cRefs);
    578578    }
     579
     580    /*
     581     * Invalidate the thread structure and free it.
     582     */
     583#ifdef IN_RING3
     584    rtLockValidatorSerializeDestructEnter();
     585#endif
     586
    579587    ASMAtomicXchgU32(&pThread->u32Magic, RTTHREADINT_MAGIC_DEAD);
    580 
    581     /*
    582      * Free resources.
    583      */
    584588    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
    593595    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);
    594607}
    595608
  • trunk/src/VBox/Runtime/include/internal/lockvalidator.h

    r25406 r25436  
    6363} RTLOCKVALIDATORPERTHREAD;
    6464
     65
     66DECLHIDDEN(void)    rtLockValidatorSerializeDestructEnter(void);
     67DECLHIDDEN(void)    rtLockValidatorSerializeDestructLeave(void);
     68
    6569RT_C_DECLS_END
    6670
  • trunk/src/VBox/Runtime/testcase/tstRTSemXRoads.cpp

    r25431 r25436  
    8080}
    8181
     82
    8283static DECLCALLBACK(int) tstTrafficNSThread(RTTHREAD hSelf, void *pvUser)
    8384{
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette