VirtualBox

Changeset 19439 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
May 6, 2009 3:04:30 PM (16 years ago)
Author:
vboxsync
Message:

PDM: Renamed PDMR3CritSectTryEnter to PDMCritSectTryEnter.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PDMAllCritSect.cpp

    r19293 r19439  
    7777    {
    7878        pCritSect->s.Core.cNestings = 1;
    79         Assert(pVCpu->hNativeThread);
     79        Assert(pVCpu->hNativeThread != NIL_RTNATIVETHREAD);
    8080        ASMAtomicXchgSize(&pCritSect->s.Core.NativeThreadOwner, pVCpu->hNativeThread);
    8181        STAM_PROFILE_ADV_START(&pCritSect->s.StatLocked, l);
     
    9999    STAM_REL_COUNTER_INC(&pCritSect->s.StatContentionRZLock);
    100100    return rcBusy;
     101#endif /* !IN_RING3 */
     102}
     103
     104
     105/**
     106 * Try enter a critical section.
     107 *
     108 * @retval  VINF_SUCCESS on success.
     109 * @retval  VERR_SEM_BUSY if the critsect was owned.
     110 * @retval  VERR_SEM_NESTED if nested enter on a no nesting section. (Asserted.)
     111 * @retval  VERR_SEM_DESTROYED if RTCritSectDelete was called while waiting.
     112 *
     113 * @param   pCritSect   The critical section.
     114 */
     115VMMDECL(int) PDMCritSectTryEnter(PPDMCRITSECT pCritSect)
     116{
     117#ifdef IN_RING3
     118    return RTCritSectTryEnter(&pCritSect->s.Core);
     119#else   /* !IN_RING3 (same code as PDMCritSectEnter except for the log statement) */
     120    AssertMsgReturn(pCritSect->s.Core.u32Magic == RTCRITSECT_MAGIC, ("%RX32\n", pCritSect->s.Core.u32Magic),
     121                    VERR_SEM_DESTROYED);
     122    PVM pVM = pCritSect->s.CTX_SUFF(pVM);
     123    Assert(pVM);
     124    PVMCPU pVCpu = VMMGetCpu(pVM);
     125    Assert(pVCpu);
     126
     127    /*
     128     * Try to take the lock.
     129     */
     130    if (ASMAtomicCmpXchgS32(&pCritSect->s.Core.cLockers, 0, -1))
     131    {
     132        pCritSect->s.Core.cNestings = 1;
     133        Assert(pVCpu->hNativeThread != NIL_RTNATIVETHREAD);
     134        ASMAtomicXchgSize(&pCritSect->s.Core.NativeThreadOwner, pVCpu->hNativeThread);
     135        STAM_PROFILE_ADV_START(&pCritSect->s.StatLocked, l);
     136        return VINF_SUCCESS;
     137    }
     138
     139    /*
     140     * Nested?
     141     */
     142    if (pCritSect->s.Core.NativeThreadOwner == pVCpu->hNativeThread)
     143    {
     144        pCritSect->s.Core.cNestings++;
     145        ASMAtomicIncS32(&pCritSect->s.Core.cLockers);
     146        return VINF_SUCCESS;
     147    }
     148
     149    /*
     150     * Failed.
     151     */
     152    LogFlow(("PDMCritSectTryEnter: locked\n"));
     153    STAM_REL_COUNTER_INC(&pCritSect->s.StatContentionRZLock);
     154    return VERR_SEM_BUSY;
    101155#endif /* !IN_RING3 */
    102156}
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