VirtualBox

Ignore:
Timestamp:
Apr 6, 2012 9:05:19 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77321
Message:

RTSpinlock: Redid the interface, eliminating NoInts and Tmp. Whether a spinlock is interrupt safe or not is now defined at creation time, preventing stupid bugs arrising from calling the wrong acquire and/or release methods somewhere. The saved flags are stored in the spinlock strucutre, eliminating the annoying Tmp variable. Needs testing on each platform before fixing the build burn.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c

    r38408 r40806  
    106106DECLINLINE(void) vboxNetAdpSetStateWithLock(PVBOXNETADP pThis, VBOXNETADPSTATE enmNewState)
    107107{
    108     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    109108    Log(("vboxNetAdpSetStateWithLock: pThis=%p, state=%d.\n", pThis, enmNewState));
    110     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     109    RTSpinlockAcquire(pThis->hSpinlock);
    111110    vboxNetAdpSetState(pThis, enmNewState);
    112     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     111    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    113112}
    114113
     
    125124{
    126125    VBOXNETADPSTATE enmState;
    127     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    128     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     126    RTSpinlockAcquire(pThis->hSpinlock);
    129127    enmState = vboxNetAdpGetState(pThis);
    130     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     128    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    131129    Log(("vboxNetAdpGetStateWithLock: pThis=%p, state=%d.\n", pThis, enmState));
    132130    return enmState;
     
    147145    VBOXNETADPSTATE enmActualState;
    148146    bool fRc = true; /* be optimistic */
    149     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    150 
    151     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     147
     148    RTSpinlockAcquire(pThis->hSpinlock);
    152149    enmActualState = vboxNetAdpGetState(pThis); /** @todo r=bird: ASMAtomicCmpXchgU32()*/
    153150    if (enmActualState == enmOldState)
     
    155152    else
    156153        fRc = false;
    157     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     154    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    158155
    159156    if (fRc)
     
    178175    for (i = 0; i < RT_ELEMENTS(pGlobals->aAdapters); i++)
    179176    {
    180         RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    181177        PVBOXNETADP pThis = &pGlobals->aAdapters[i];
    182         RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     178        RTSpinlockAcquire(pThis->hSpinlock);
    183179        if (    vboxNetAdpGetState(pThis)
    184180            &&  !strcmp(pThis->szName, pszName))
    185181        {
    186             RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     182            RTSpinlockReleaseNoInts(pThis->hSpinlock);
    187183            return pThis;
    188184        }
    189         RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     185        RTSpinlockReleaseNoInts(pThis->hSpinlock);
    190186    }
    191187    return NULL;
     
    340336DECLHIDDEN(bool) vboxNetAdpPrepareToReceive(PVBOXNETADP pThis)
    341337{
    342     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    343338    bool fCanReceive  = false;
    344339    /*
     
    347342    AssertPtr(pThis);
    348343    Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
    349     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     344    RTSpinlockAcquire(pThis->hSpinlock);
    350345    if (vboxNetAdpGetState(pThis) == kVBoxNetAdpState_Active)
    351346    {
     
    354349        vboxNetAdpBusy(pThis);
    355350    }
    356     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     351    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    357352    Log(("vboxNetAdpPrepareToReceive: fCanReceive=%d.\n", fCanReceive));
    358353
     
    368363DECLHIDDEN(void) vboxNetAdpReceive(PVBOXNETADP pThis, PINTNETSG pSG)
    369364{
    370     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    371365    /*
    372366     * Input validation.
     
    401395static DECLCALLBACK(int) vboxNetAdpPortXmit(PINTNETTRUNKIFPORT pIfPort, PINTNETSG pSG, uint32_t fDst)
    402396{
    403     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    404397    PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
    405398    int rc = VINF_SUCCESS;
     
    417410     * Do a retain/busy, invoke the OS specific code.
    418411     */
    419     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     412    RTSpinlockAcquire(pThis->hSpinlock);
    420413    if (vboxNetAdpGetState(pThis) != kVBoxNetAdpState_Active)
    421414    {
    422         RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     415        RTSpinlockReleaseNoInts(pThis->hSpinlock);
    423416        Log(("vboxNetAdpReceive: Dropping incoming packet for inactive interface %s.\n",
    424417             pThis->szName));
     
    427420    vboxNetAdpRetain(pThis);
    428421    vboxNetAdpBusy(pThis);
    429     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     422    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    430423
    431424    rc = vboxNetAdpPortOsXmit(pThis, pSG, fDst);
     
    494487{
    495488    bool fPreviouslyActive;
    496     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    497489    PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
    498490
     
    505497
    506498    Log(("vboxNetAdpPortSetActive: pThis=%p, fActive=%d, state before: %d.\n", pThis, fActive, vboxNetAdpGetState(pThis)));
    507     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     499    RTSpinlockAcquire(pThis->hSpinlock);
    508500
    509501    fPreviouslyActive = vboxNetAdpGetState(pThis) == kVBoxNetAdpState_Active;
     
    523515    }
    524516
    525     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     517    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    526518    Log(("vboxNetAdpPortSetActive: state after: %RTbool.\n", vboxNetAdpGetState(pThis)));
    527519    return fPreviouslyActive;
     
    535527{
    536528    PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
    537     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    538529
    539530    /*
     
    551542     * Disconnect and release it.
    552543     */
    553     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     544    RTSpinlockAcquire(pThis->hSpinlock);
    554545    //Assert(vboxNetAdpGetState(pThis) == kVBoxNetAdpState_Connected);
    555546    Assert(!pThis->cBusy);
    556547    vboxNetAdpSetState(pThis, kVBoxNetAdpState_Transitional);
    557     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     548    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    558549
    559550    vboxNetAdpOsDisconnectIt(pThis);
    560551    pThis->pSwitchPort = NULL;
    561552
    562     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     553    RTSpinlockAcquire(pThis->hSpinlock);
    563554    vboxNetAdpSetState(pThis, kVBoxNetAdpState_Available);
    564     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     555    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    565556
    566557    vboxNetAdpRelease(pThis);
     
    590581int vboxNetAdpCreate(PINTNETTRUNKFACTORY pIfFactory, PVBOXNETADP *ppNew)
    591582{
     583    PVBOXNETADPGLOBALS pGlobals = (PVBOXNETADPGLOBALS)((uint8_t *)pIfFactory - RT_OFFSETOF(VBOXNETADPGLOBALS, TrunkFactory));
     584    unsigned i;
    592585    int rc;
    593     unsigned i;
    594     PVBOXNETADPGLOBALS pGlobals = (PVBOXNETADPGLOBALS)((uint8_t *)pIfFactory - RT_OFFSETOF(VBOXNETADPGLOBALS, TrunkFactory));
    595586
    596587    for (i = 0; i < RT_ELEMENTS(pGlobals->aAdapters); i++)
    597588    {
    598         RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    599589        PVBOXNETADP pThis = &pGlobals->aAdapters[i];
    600590
     
    608598            rc = vboxNetAdpOsCreate(pThis, &Mac);
    609599            *ppNew = pThis;
    610             RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     600
     601            RTSpinlockAcquire(pThis->hSpinlock);
    611602            vboxNetAdpSetState(pThis, kVBoxNetAdpState_Available);
    612             RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     603            RTSpinlockReleaseNoInts(pThis->hSpinlock);
    613604            return rc;
    614605        }
     
    622613{
    623614    int rc = VINF_SUCCESS;
    624     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    625 
    626     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     615
     616    RTSpinlockAcquire(pThis->hSpinlock);
    627617    if (vboxNetAdpGetState(pThis) != kVBoxNetAdpState_Available || pThis->cBusy)
    628618    {
    629         RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     619        RTSpinlockReleaseNoInts(pThis->hSpinlock);
    630620        return VERR_INTNET_FLT_IF_BUSY;
    631621    }
    632622    vboxNetAdpSetState(pThis, kVBoxNetAdpState_Transitional);
    633     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     623    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    634624    vboxNetAdpRelease(pThis);
    635625
    636626    vboxNetAdpOsDestroy(pThis);
    637627
    638     RTSpinlockAcquireNoInts(pThis->hSpinlock, &Tmp);
     628    RTSpinlockAcquire(pThis->hSpinlock);
    639629    vboxNetAdpSetState(pThis, kVBoxNetAdpState_Invalid);
    640     RTSpinlockReleaseNoInts(pThis->hSpinlock, &Tmp);
     630    RTSpinlockReleaseNoInts(pThis->hSpinlock);
    641631
    642632    return rc;
     
    856846    pNew->hEventIdle                    = NIL_RTSEMEVENT;
    857847
    858     rc = RTSpinlockCreate(&pNew->hSpinlock);
     848    rc = RTSpinlockCreate(&pNew->hSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "VBoxNetAdptSlotCreate");
    859849    if (RT_SUCCESS(rc))
    860850    {
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