Changeset 24058 in vbox
- Timestamp:
- Oct 25, 2009 5:36:56 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 53917
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvNAT.cpp
r23462 r24058 287 287 { 288 288 rc = pThis->pPort->pfnReceive(pThis->pPort, pu8Buf, cb); 289 rc = RTCritSectLeave(&pThis->csDevAccess);290 289 AssertReleaseRC(rc); 291 slirp_ext_m_free(pThis->pNATState, pvArg);292 290 } 293 291 else if ( RT_FAILURE(rc) 294 292 && ( 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); 299 296 } 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 306 301 if (ASMAtomicDecU32(&pThis->cUrgPkt) == 0) 307 302 { … … 309 304 drvNATNotifyNATThread(pThis); 310 305 } 306 slirp_ext_m_free(pThis->pNATState, pvArg); 311 307 } 312 308 … … 314 310 static DECLCALLBACK(void) drvNATRecvWorker(PDRVNAT pThis, uint8_t *pu8Buf, int cb, void *pvArg) 315 311 { 312 int rc; 316 313 STAM_PROFILE_START(&pThis->StatNATRecv, a); 317 314 … … 319 316 320 317 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 324 328 rc = pThis->pPort->pfnWaitReceiveAvail(pThis->pPort, RT_INDEFINITE_WAIT); 325 329 if (RT_SUCCESS(rc)) … … 327 331 rc = pThis->pPort->pfnReceive(pThis->pPort, pu8Buf, cb); 328 332 AssertReleaseRC(rc); 329 rc = RTCritSectLeave(&pThis->csDevAccess);330 AssertReleaseRC(rc);331 slirp_ext_m_free(pThis->pNATState, pvArg);332 333 } 333 334 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 { 338 338 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); 343 done_unlocked: 344 slirp_ext_m_free(pThis->pNATState, pvArg); 347 345 ASMAtomicDecU32(&pThis->cPkt); 348 346
Note:
See TracChangeset
for help on using the changeset viewer.