VirtualBox

Changeset 37419 in vbox for trunk/src/VBox/Runtime/generic


Ignore:
Timestamp:
Jun 11, 2011 8:25:37 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
72218
Message:

PDM/IPRT CritSect: Introduced the NOP critical section for simplifying locking in IOM and TM. (Revisiting device emulation locking, making it more fine grained over time.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/generic/critsect-generic.cpp

    r36492 r37419  
    5252                             const char *pszNameFmt, ...)
    5353{
    54     AssertReturn(!(fFlags & ~(RTCRITSECT_FLAGS_NO_NESTING | RTCRITSECT_FLAGS_NO_LOCK_VAL | RTCRITSECT_FLAGS_BOOTSTRAP_HACK)),
     54    AssertReturn(!(fFlags & ~(RTCRITSECT_FLAGS_NO_NESTING | RTCRITSECT_FLAGS_NO_LOCK_VAL | RTCRITSECT_FLAGS_BOOTSTRAP_HACK | RTCRITSECT_FLAGS_NOP)),
    5555                 VERR_INVALID_PARAMETER);
    5656
     
    6666    int rc = VINF_SUCCESS;
    6767#ifdef RTCRITSECT_STRICT
    68     if (!(fFlags & RTCRITSECT_FLAGS_BOOTSTRAP_HACK))
     68    if (!(fFlags & (RTCRITSECT_FLAGS_BOOTSTRAP_HACK | RTCRITSECT_FLAGS_NOP)))
    6969    {
    7070        if (!pszNameFmt)
     
    111111    AssertPtrReturn(pCritSect, RTLOCKVAL_SUB_CLASS_INVALID);
    112112    AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, RTLOCKVAL_SUB_CLASS_INVALID);
     113    AssertReturn(!(pCritSect->fFlags & RTCRITSECT_FLAGS_NOP), RTLOCKVAL_SUB_CLASS_INVALID);
    113114    return RTLockValidatorRecExclSetSubClass(pCritSect->pValidatorRec, uSubClass);
    114115#else
     
    122123    Assert(pCritSect);
    123124    Assert(pCritSect->u32Magic == RTCRITSECT_MAGIC);
    124     RTNATIVETHREAD  NativeThreadSelf = RTThreadNativeSelf();
     125    /*AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, VERR_SEM_DESTROYED);*/
     126
     127    /*
     128     * Return straight away if NOP.
     129     */
     130    if (pCritSect->fFlags & RTCRITSECT_FLAGS_NOP)
     131        return VINF_SUCCESS;
    125132
    126133    /*
    127134     * Try take the lock. (cLockers is -1 if it's free)
    128135     */
     136    RTNATIVETHREAD NativeThreadSelf = RTThreadNativeSelf();
    129137    if (!ASMAtomicCmpXchgS32(&pCritSect->cLockers, 0, -1))
    130138    {
     
    186194DECL_FORCE_INLINE(int) rtCritSectEnter(PRTCRITSECT pCritSect, PCRTLOCKVALSRCPOS pSrcPos)
    187195{
    188     Assert(pCritSect);
    189     Assert(pCritSect->u32Magic == RTCRITSECT_MAGIC);
     196    AssertPtr(pCritSect);
     197    AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, VERR_SEM_DESTROYED);
     198
     199    /*
     200     * Return straight away if NOP.
     201     */
     202    if (pCritSect->fFlags & RTCRITSECT_FLAGS_NOP)
     203        return VINF_SUCCESS;
     204
     205    /*
     206     * How is calling and is the order right?
     207     */
    190208    RTNATIVETHREAD  NativeThreadSelf = RTThreadNativeSelf();
    191 
    192     /* If the critical section has already been destroyed, then inform the caller. */
    193     if (pCritSect->u32Magic != RTCRITSECT_MAGIC)
    194         return VERR_SEM_DESTROYED;
    195 
    196 #ifdef RTCRITSECT_STRICT
    197     RTTHREAD hThreadSelf = pCritSect->pValidatorRec
    198                          ? RTThreadSelfAutoAdopt()
    199                          : RTThreadSelf();
    200     int      rc9;
     209#ifdef RTCRITSECT_STRICT
     210    RTTHREAD        hThreadSelf = pCritSect->pValidatorRec
     211                                ? RTThreadSelfAutoAdopt()
     212                                : RTThreadSelf();
     213    int             rc9;
    201214    if (pCritSect->pValidatorRec) /* (bootstap) */
    202215    {
     
    305318{
    306319    /*
    307      * Assert ownership and so on.
     320     * Assert sanity and check for NOP.
    308321     */
    309322    Assert(pCritSect);
    310323    Assert(pCritSect->u32Magic == RTCRITSECT_MAGIC);
     324    if (pCritSect->fFlags & RTCRITSECT_FLAGS_NOP)
     325        return VINF_SUCCESS;
     326
     327    /*
     328     * Assert ownership and so on.
     329     */
    311330    Assert(pCritSect->cNestings > 0);
    312331    Assert(pCritSect->cLockers >= 0);
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