VirtualBox

Changeset 51940 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Jul 8, 2014 5:45:51 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
94833
Message:

GMMR0: Switched from fast mutex to critical section for the giant GMMR0 lock to avoid running into unnecessary trouble with the windows driver verifier. Required making the critical section code compile and link in the ring-0 environment.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r51868 r51940  
    17551755        common/time/timesup.cpp \
    17561756        generic/RTAssertShouldPanic-generic.cpp \
     1757        generic/critsect-generic.cpp \
    17571758        \
    17581759        $(RuntimeNoCrt_SOURCES)
     
    19351936        generic/RTSemEventMultiWait-2-ex-generic.cpp \
    19361937        generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp \
     1938        generic/critsect-generic.cpp \
    19371939        generic/errvars-generic.cpp \
    19381940        generic/uuid-generic.cpp \
  • trunk/src/VBox/Runtime/generic/critsect-generic.cpp

    r48935 r51940  
    5959     */
    6060    pCritSect->u32Magic             = RTCRITSECT_MAGIC;
    61     pCritSect->fFlags               = fFlags;
     61#ifdef IN_RING0
     62    pCritSect->fFlags               = fFlags | RTCRITSECT_FLAGS_RING0;
     63#else
     64    pCritSect->fFlags               = fFlags & ~RTCRITSECT_FLAGS_RING0;
     65#endif
    6266    pCritSect->cNestings            = 0;
    6367    pCritSect->cLockers             = -1;
     
    8791    if (RT_SUCCESS(rc))
    8892    {
     93#ifdef IN_RING0
     94        rc = RTSemEventCreate(&pCritSect->EventSem);
     95
     96#else
    8997        rc = RTSemEventCreateEx(&pCritSect->EventSem,
    9098                                fFlags & RTCRITSECT_FLAGS_BOOTSTRAP_HACK
     
    93101                                NIL_RTLOCKVALCLASS,
    94102                                NULL);
     103#endif
    95104        if (RT_SUCCESS(rc))
    96105            return VINF_SUCCESS;
     106#ifdef RTCRITSECT_STRICT
    97107        RTLockValidatorRecExclDestroy(&pCritSect->pValidatorRec);
     108#endif
    98109    }
    99110
     
    108119RTDECL(uint32_t) RTCritSectSetSubClass(PRTCRITSECT pCritSect, uint32_t uSubClass)
    109120{
    110 #ifdef RTCRITSECT_STRICT
     121# ifdef RTCRITSECT_STRICT
    111122    AssertPtrReturn(pCritSect, RTLOCKVAL_SUB_CLASS_INVALID);
    112123    AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, RTLOCKVAL_SUB_CLASS_INVALID);
    113124    AssertReturn(!(pCritSect->fFlags & RTCRITSECT_FLAGS_NOP), RTLOCKVAL_SUB_CLASS_INVALID);
    114125    return RTLockValidatorRecExclSetSubClass(pCritSect->pValidatorRec, uSubClass);
    115 #else
     126# else
    116127    return RTLOCKVAL_SUB_CLASS_INVALID;
    117 #endif
     128# endif
    118129}
    119130
     
    124135    Assert(pCritSect->u32Magic == RTCRITSECT_MAGIC);
    125136    /*AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, VERR_SEM_DESTROYED);*/
     137#ifdef IN_RING0
     138    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
     139#else
     140    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
     141#endif
    126142
    127143    /*
     
    196212    AssertPtr(pCritSect);
    197213    AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, VERR_SEM_DESTROYED);
     214#ifdef IN_RING0
     215    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
     216#else
     217    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
     218#endif
    198219
    199220    /*
     
    267288                return rc9;
    268289            }
    269 #else
     290#elif defined(IN_RING3)
    270291            RTThreadBlocking(hThreadSelf, RTTHREADSTATE_CRITSECT, false);
    271292#endif
    272293            int rc = RTSemEventWait(pCritSect->EventSem, RT_INDEFINITE_WAIT);
     294#ifdef IN_RING3
    273295            RTThreadUnblocked(hThreadSelf, RTTHREADSTATE_CRITSECT);
     296#endif
    274297
    275298            if (pCritSect->u32Magic != RTCRITSECT_MAGIC)
     
    322345    Assert(pCritSect);
    323346    Assert(pCritSect->u32Magic == RTCRITSECT_MAGIC);
     347#ifdef IN_RING0
     348    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
     349#else
     350    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
     351#endif
    324352    if (pCritSect->fFlags & RTCRITSECT_FLAGS_NOP)
    325353        return VINF_SUCCESS;
     
    363391
    364392
    365 
     393#ifdef IN_RING3
    366394
    367395static int rtCritSectEnterMultiple(size_t cCritSects, PRTCRITSECT *papCritSects, PCRTLOCKVALSRCPOS pSrcPos)
     
    477505RT_EXPORT_SYMBOL(RTCritSectLeaveMultiple);
    478506
     507#endif /* IN_RING3 */
     508
     509
    479510
    480511RTDECL(int) RTCritSectDelete(PRTCRITSECT pCritSect)
     
    488519    Assert(pCritSect->cLockers == -1);
    489520    Assert(pCritSect->NativeThreadOwner == NIL_RTNATIVETHREAD);
     521#ifdef IN_RING0
     522    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
     523#else
     524    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
     525#endif
    490526
    491527    /*
     
    506542    AssertRC(rc);
    507543
     544#ifdef RTCRITSECT_STRICT
    508545    RTLockValidatorRecExclDestroy(&pCritSect->pValidatorRec);
     546#endif
    509547
    510548    return rc;
Note: See TracChangeset for help on using the changeset viewer.

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