VirtualBox

Changeset 24058 in vbox


Ignore:
Timestamp:
Oct 25, 2009 5:36:56 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53917
Message:

NAT: simplefeing UrgRecv and Recv workers routines.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r23462 r24058  
    287287    {
    288288        rc = pThis->pPort->pfnReceive(pThis->pPort, pu8Buf, cb);
    289         rc = RTCritSectLeave(&pThis->csDevAccess);
    290289        AssertReleaseRC(rc);
    291         slirp_ext_m_free(pThis->pNATState, pvArg);
    292290    }
    293291    else if (   RT_FAILURE(rc)
    294292             && (  rc == VERR_TIMEOUT
    295                 || rc == VERR_INTERRUPTED))
    296     {
    297         rc = RTCritSectLeave(&pThis->csDevAccess);
    298         slirp_ext_m_free(pThis->pNATState, pvArg);
     293                && rc == VERR_INTERRUPTED))
     294    {
     295        AssertReleaseRC(rc);
    299296    }
    300     else
    301     {
    302         rc = RTCritSectLeave(&pThis->csDevAccess);
    303         slirp_ext_m_free(pThis->pNATState, pvArg);
    304         AssertReleaseRC(rc);
    305     }
     297
     298    rc = RTCritSectLeave(&pThis->csDevAccess);
     299    AssertReleaseRC(rc);
     300
    306301    if (ASMAtomicDecU32(&pThis->cUrgPkt) == 0)
    307302    {
     
    309304        drvNATNotifyNATThread(pThis);
    310305    }
     306    slirp_ext_m_free(pThis->pNATState, pvArg);
    311307}
    312308
     
    314310static DECLCALLBACK(void) drvNATRecvWorker(PDRVNAT pThis, uint8_t *pu8Buf, int cb, void *pvArg)
    315311{
     312    int rc;
    316313    STAM_PROFILE_START(&pThis->StatNATRecv, a);
    317314
     
    319316
    320317    while(ASMAtomicReadU32(&pThis->cUrgPkt) != 0)
    321         RTSemEventWait(pThis->EventRecv, RT_INDEFINITE_WAIT);
    322 
    323     int rc = RTCritSectEnter(&pThis->csDevAccess);
     318    {
     319        rc = RTSemEventWait(pThis->EventRecv, RT_INDEFINITE_WAIT);
     320        if (   RT_FAILURE(rc)
     321            && ( rc == VERR_TIMEOUT
     322                 || rc == VERR_INTERRUPTED))
     323            goto done_unlocked;
     324    }
     325
     326    rc = RTCritSectEnter(&pThis->csDevAccess);
     327
    324328    rc = pThis->pPort->pfnWaitReceiveAvail(pThis->pPort, RT_INDEFINITE_WAIT);
    325329    if (RT_SUCCESS(rc))
     
    327331        rc = pThis->pPort->pfnReceive(pThis->pPort, pu8Buf, cb);
    328332        AssertReleaseRC(rc);
    329         rc = RTCritSectLeave(&pThis->csDevAccess);
    330         AssertReleaseRC(rc);
    331         slirp_ext_m_free(pThis->pNATState, pvArg);
    332333    }
    333334    else if (   RT_FAILURE(rc)
    334              && (  rc == VERR_TIMEOUT
    335                 || rc == VERR_INTERRUPTED))
    336     {
    337         rc = RTCritSectLeave(&pThis->csDevAccess);
     335             && (  rc != VERR_TIMEOUT
     336                && rc != VERR_INTERRUPTED))
     337    {
    338338        AssertReleaseRC(rc);
    339         slirp_ext_m_free(pThis->pNATState, pvArg);
    340     }
    341     else
    342     {
    343         rc = RTCritSectLeave(&pThis->csDevAccess);
    344         slirp_ext_m_free(pThis->pNATState, pvArg);
    345         AssertReleaseRC(rc);
    346     }
     339    }
     340
     341    rc = RTCritSectLeave(&pThis->csDevAccess);
     342    AssertReleaseRC(rc);
     343done_unlocked:
     344    slirp_ext_m_free(pThis->pNATState, pvArg);
    347345    ASMAtomicDecU32(&pThis->cPkt);
    348346
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