VirtualBox

Changeset 62145 in vbox for trunk


Ignore:
Timestamp:
Jul 8, 2016 4:35:35 PM (9 years ago)
Author:
vboxsync
Message:

PDMCritSectAll.cpp: Prepped a few optimizations.

File:
1 edited

Legend:

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

    r58123 r62145  
    5353
    5454
     55/** Skips some of the overly paranoid atomic updates.
     56 * Makes some assumptions about cache coherence, though not brave enough not to
     57 * always end with an atomic update. */
     58//#define PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     59
    5560/* Undefine the automatic VBOX_STRICT API mappings. */
    5661#undef PDMCritSectEnter
     
    9499    Assert(!(pCritSect->s.Core.fFlags & PDMCRITSECT_FLAGS_PENDING_UNLOCK));
    95100
     101# ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     102    pCritSect->s.Core.cNestings = 1;
     103# else
    96104    ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 1);
     105# endif
    97106    Assert(pCritSect->s.Core.cNestings == 1);
    98107    ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, hNativeSelf);
     
    242251    if (pCritSect->s.Core.NativeThreadOwner == hNativeSelf)
    243252    {
     253        Assert(pCritSect->s.Core.cNestings >= 1);
     254# ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     255        pCritSect->s.Core.cNestings += 1;
     256# else
     257        ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
     258# endif
    244259        ASMAtomicIncS32(&pCritSect->s.Core.cLockers);
    245         ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
    246         Assert(pCritSect->s.Core.cNestings > 1);
    247260        return VINF_SUCCESS;
    248261    }
     
    432445    if (pCritSect->s.Core.NativeThreadOwner == hNativeSelf)
    433446    {
     447        Assert(pCritSect->s.Core.cNestings >= 1);
     448# ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     449        pCritSect->s.Core.cNestings += 1;
     450# else
     451        ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
     452# endif
    434453        ASMAtomicIncS32(&pCritSect->s.Core.cLockers);
    435         ASMAtomicIncS32(&pCritSect->s.Core.cNestings);
    436         Assert(pCritSect->s.Core.cNestings > 1);
    437454        return VINF_SUCCESS;
    438455    }
     
    555572                            pCritSect->s.Core.cLockers, pCritSect->s.Core.cNestings),
    556573                           VERR_NOT_OWNER);
    557     Assert(pCritSect->s.Core.cNestings >= 1);
    558574
    559575    /*
    560576     * Nested leave.
    561577     */
    562     if (pCritSect->s.Core.cNestings > 1)
    563     {
    564         ASMAtomicDecS32(&pCritSect->s.Core.cNestings);
    565         Assert(pCritSect->s.Core.cNestings >= 1);
     578    int32_t const cNestings = pCritSect->s.Core.cNestings;
     579    Assert(cNestings >= 1);
     580    if (cNestings > 1)
     581    {
     582# ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     583        pCritSect->s.Core.cNestings = cNestings - 1;
     584# else
     585        ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, cNestings - 1);
     586# endif
    566587        ASMAtomicDecS32(&pCritSect->s.Core.cLockers);
    567588        Assert(pCritSect->s.Core.cLockers >= 0);
     
    591612        Assert(!pCritSect->s.Core.pValidatorRec || pCritSect->s.Core.pValidatorRec->hThread == NIL_RTTHREAD);
    592613# endif
     614# ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     615        //pCritSect->s.Core.cNestings = 0; /* not really needed */
     616        pCritSect->s.Core.NativeThreadOwner = NIL_RTNATIVETHREAD;
     617# else
     618        ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 0);
     619        ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, NIL_RTNATIVETHREAD);
     620# endif
    593621        ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
    594         ASMAtomicWriteHandle(&pCritSect->s.Core.NativeThreadOwner, NIL_RTNATIVETHREAD);
    595         ASMAtomicDecS32(&pCritSect->s.Core.cNestings);
    596         Assert(pCritSect->s.Core.cNestings == 0);
    597622
    598623        /* stop and decrement lockers. */
    599624        STAM_PROFILE_ADV_STOP(&pCritSect->s.StatLocked, l);
    600625        ASMCompilerBarrier();
    601         if (ASMAtomicDecS32(&pCritSect->s.Core.cLockers) >= 0)
     626        if (ASMAtomicDecS32(&pCritSect->s.Core.cLockers) < 0)
     627        { /* hopefully likely */ }
     628        else
    602629        {
    603630            /* Someone is waiting, wake up one of them. */
     
    609636
    610637        /* Signal exit event. */
    611         if (hEventToSignal != NIL_SUPSEMEVENT)
     638        if (RT_LIKELY(hEventToSignal == NIL_SUPSEMEVENT))
     639        { /* likely */ }
     640        else
    612641        {
    613642            Log8(("Signalling %#p\n", hEventToSignal));
     
    631660        if (pCritSect->s.Core.cLockers == 0)
    632661        {
     662# ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     663            //pCritSect->s.Core.cNestings = 0; /* not really needed */
     664# else
    633665            ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 0);
     666# endif
    634667            RTNATIVETHREAD hNativeThread = pCritSect->s.Core.NativeThreadOwner;
    635668            ASMAtomicAndU32(&pCritSect->s.Core.fFlags, ~PDMCRITSECT_FLAGS_PENDING_UNLOCK);
     
    644677            STAM_PROFILE_ADV_START(&pCritSect->s.StatLocked, l);
    645678            Assert(pCritSect->s.Core.cNestings == 0);
     679# ifdef PDMCRITSECT_WITH_LESS_ATOMIC_STUFF
     680            //pCritSect->s.Core.cNestings = 1;
     681# else
    646682            ASMAtomicWriteS32(&pCritSect->s.Core.cNestings, 1);
     683# endif
    647684        }
    648685        ASMAtomicOrU32(&pCritSect->s.Core.fFlags, PDMCRITSECT_FLAGS_PENDING_UNLOCK);
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