Changeset 752 in vbox
- Timestamp:
- Feb 7, 2007 3:35:59 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 18410
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevPCNet.cpp
r731 r752 1860 1860 * If we've reached the maxium number of frames, they will be flushed. 1861 1861 */ 1862 DECLINLINE(void) pcnetXmitCompleteFrame(PCNetState *pData) 1863 { 1862 DECLINLINE(int) pcnetXmitCompleteFrame(PCNetState *pData) 1863 { 1864 HSEMEVENT hSem = pData->hSendEventSem; 1865 1864 1866 /* Don't hold the critical section while transmitting data. */ 1865 1867 /** @note also avoids deadlocks with NAT as it can call us right back. */ … … 1870 1872 STAM_PROFILE_ADV_STOP(&pData->StatTransmitSend, a); 1871 1873 1872 int rc = PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED); 1873 AssertReleaseRC(rc); 1874 return PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED); 1874 1875 } 1875 1876 … … 1967 1968 * Try to transmit frames 1968 1969 */ 1969 static voidpcnetAsyncTransmit(PCNetState *pData)1970 static int pcnetAsyncTransmit(PCNetState *pData) 1970 1971 { 1971 1972 #ifdef VBOX_WITH_STATISTICS … … 2023 2024 pcnetXmitLoopbackFrame(pData); 2024 2025 else 2025 pcnetXmitCompleteFrame(pData); 2026 { 2027 int rc = pcnetXmitCompleteFrame(pData); 2028 if (VBOX_FAILURE(rc)) 2029 return rc; /* can happen during termination */ 2030 } 2026 2031 } 2027 2032 else … … 2100 2105 pData->SendFrame.cb, iStart, CSR_XMTRC(pData))); 2101 2106 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 } 2103 2112 else if (CSR_LOOP(pData) && !fDropFrame) 2104 2113 pcnetXmitLoopbackFrame(pData); … … 2155 2164 pcnetUpdateIrq(pData); 2156 2165 STAM_PROFILE_ADV_STOP(&pData->StatTransmit, a); 2166 2167 return VINF_SUCCESS; 2157 2168 } 2158 2169 … … 2164 2175 PCNetState *pData = (PCNetState *)pvUser; 2165 2176 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); 2170 2182 if (VBOX_FAILURE(rc)) 2171 2183 break; … … 2174 2186 AssertReleaseRC(rc); 2175 2187 2176 pcnetAsyncTransmit(pData); 2177 2188 rc = pcnetAsyncTransmit(pData); 2178 2189 PDMCritSectLeave(&pData->CritSect); 2179 2190 } … … 3892 3903 { 3893 3904 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 3898 3913 PDMR3CritSectDelete(&pData->CritSect); 3899 3914 return VINF_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.