VirtualBox

Changeset 752 in vbox


Ignore:
Timestamp:
Feb 7, 2007 3:35:59 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
18410
Message:

Fixed cleanup

File:
1 edited

Legend:

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

    r731 r752  
    18601860 * If we've reached the maxium number of frames, they will be flushed.
    18611861 */
    1862 DECLINLINE(void) pcnetXmitCompleteFrame(PCNetState *pData)
    1863 {
     1862DECLINLINE(int) pcnetXmitCompleteFrame(PCNetState *pData)
     1863{
     1864    HSEMEVENT hSem = pData->hSendEventSem;
     1865
    18641866    /* Don't hold the critical section while transmitting data. */
    18651867    /** @note also avoids deadlocks with NAT as it can call us right back. */
     
    18701872    STAM_PROFILE_ADV_STOP(&pData->StatTransmitSend, a);
    18711873
    1872     int rc = PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED);
    1873     AssertReleaseRC(rc);
     1874    return PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED);
    18741875}
    18751876
     
    19671968 * Try to transmit frames
    19681969 */
    1969 static void pcnetAsyncTransmit(PCNetState *pData)
     1970static int pcnetAsyncTransmit(PCNetState *pData)
    19701971{
    19711972#ifdef VBOX_WITH_STATISTICS
     
    20232024                    pcnetXmitLoopbackFrame(pData);
    20242025                else
    2025                     pcnetXmitCompleteFrame(pData);
     2026                {
     2027                    int rc = pcnetXmitCompleteFrame(pData);
     2028                    if (VBOX_FAILURE(rc))
     2029                        return rc; /* can happen during termination */
     2030                }
    20262031            }
    20272032            else
     
    21002105                         pData->SendFrame.cb, iStart, CSR_XMTRC(pData)));
    21012106                    if (pcnetIsLinkUp(pData) && !fDropFrame)
    2102                         pcnetXmitCompleteFrame(pData);
     2107                    {
     2108                        int rc = pcnetXmitCompleteFrame(pData);
     2109                        if (VBOX_FAILURE(rc))
     2110                            return rc; /* can happen during termination */
     2111                    }
    21032112                    else if (CSR_LOOP(pData) && !fDropFrame)
    21042113                        pcnetXmitLoopbackFrame(pData);
     
    21552164    pcnetUpdateIrq(pData);
    21562165    STAM_PROFILE_ADV_STOP(&pData->StatTransmit, a);
     2166
     2167    return VINF_SUCCESS;
    21572168}
    21582169
     
    21642175    PCNetState *pData = (PCNetState *)pvUser;
    21652176    RTSEMEVENT hEvent = pData->hSendEventSem;
    2166 
    2167     while(1)
    2168     {
    2169         int rc = RTSemEventWait(hEvent, RT_INDEFINITE_WAIT);
     2177    int        rc     = VINF_SUCCESS;
     2178
     2179    while(rc == VINF_SUCCESS)
     2180    {
     2181        rc = RTSemEventWait(hEvent, RT_INDEFINITE_WAIT);
    21702182        if (VBOX_FAILURE(rc))
    21712183            break;
     
    21742186        AssertReleaseRC(rc);
    21752187
    2176         pcnetAsyncTransmit(pData);
    2177 
     2188        rc = pcnetAsyncTransmit(pData);
    21782189        PDMCritSectLeave(&pData->CritSect);
    21792190    }
     
    38923903{
    38933904    PCNetState *pData = PDMINS2DATA(pDevIns, PCNetState *);
    3894 #ifdef PCNET_ASYNC_SEND
    3895     if (pData->pSendQueue)
    3896         RTReqDestroyQueue(pData->pSendQueue);
    3897 #endif
     3905
     3906    int rc = PDMCritSectEnter(&pData->CritSect, VERR_ACCESS_DENIED);
     3907    AssertReleaseRC(rc);
     3908
     3909    RTSemEventDestroy(pData->hSendEventSem);
     3910    pData->hSendEventSem = 0;
     3911    PDMCritSectLeave(&pData->CritSect);
     3912
    38983913    PDMR3CritSectDelete(&pData->CritSect);
    38993914    return VINF_SUCCESS;
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