Changeset 6931 in vbox for trunk/src/VBox/Devices/Network
- Timestamp:
- Feb 13, 2008 12:53:15 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 28086
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvTAP.cpp
r6300 r6931 125 125 /** The read end of the control pipe. */ 126 126 RTFILE PipeRead; 127 /** The thread state. */128 ASYNCSTATE volatile enmState;129 127 /** Reader thread. */ 130 RTTHREADThread;128 PPDMTHREAD pThread; 131 129 /** We are waiting for more receive buffers. */ 132 130 uint32_t volatile fOutOfSpace; … … 282 280 * @param pvUser Pointer to a DRVTAP structure. 283 281 */ 284 static DECLCALLBACK(int) drvTAPAsyncIoThread( RTTHREAD ThreadSelf, void *pvUser)285 { 286 PDRVTAP pData = (PDRVTAP)pvUser;282 static DECLCALLBACK(int) drvTAPAsyncIoThread(PPDMDRVINS pDrvIns, PPDMTHREAD pThread) 283 { 284 PDRVTAP pData = PDMINS2DATA(pDrvIns, PDRVTAP); 287 285 LogFlow(("drvTAPAsyncIoThread: pData=%p\n", pData)); 286 287 if (pThread->enmState == PDMTHREADSTATE_INITIALIZING) 288 return VINF_SUCCESS; 289 288 290 STAM_PROFILE_ADV_START(&pData->StatReceive, a); 289 291 … … 294 296 * Polling loop. 295 297 */ 296 for (;;)298 while (pThread->enmState == PDMTHREADSTATE_RUNNING) 297 299 { 298 300 /* … … 309 311 errno=0; 310 312 rc = poll(&aFDs[0], ELEMENTS(aFDs), -1 /* infinite */); 313 314 /* this might have changed in the meantime */ 315 if (pThread->enmState != PDMTHREADSTATE_RUNNING) 316 break; 317 311 318 STAM_PROFILE_ADV_START(&pData->StatReceive, a); 312 319 if ( rc > 0 … … 350 357 STAM_PROFILE_START(&pData->StatRecvOverflows, b); 351 358 while ( cbMax == 0 352 && p Data->enmState != ASYNCSTATE_TERMINATE)359 && pThread->enmState == PDMTHREADSTATE_RUNNING) 353 360 { 354 361 LogFlow(("drvTAPAsyncIoThread: cbMax=%d cbRead=%d waiting...\n", cbMax, cbRead)); … … 365 372 STAM_PROFILE_STOP(&pData->StatRecvOverflows, b); 366 373 STAM_PROFILE_ADV_START(&pData->StatReceive, a); 367 if (p Data->enmState == ASYNCSTATE_TERMINATE)374 if (pThread->enmState == PDMTHREADSTATE_RUNNING) 368 375 break; 369 376 } … … 397 404 && aFDs[1].revents) 398 405 { 399 LogFlow(("drvTAPAsyncIoThread: Control message: enmState=%d revents=%#x\n", pData->enmState, aFDs[1].revents)); 400 if (pData->enmState == ASYNCSTATE_TERMINATE) 401 break; 406 LogFlow(("drvTAPAsyncIoThread: Control message: enmState=%d revents=%#x\n", pThread->enmState, aFDs[1].revents)); 402 407 if (aFDs[1].revents & (POLLHUP | POLLERR | POLLNVAL)) 403 408 break; … … 432 437 } 433 438 434 #else 439 440 /** 441 * Unblock the send thread so it can respond to a state change. 442 * 443 * @returns VBox status code. 444 * @param pDevIns The pcnet device instance. 445 * @param pThread The send thread. 446 */ 447 static DECLCALLBACK(int) drvTapAsyncIoWakeup(PPDMDRVINS pDrvIns, PPDMTHREAD pThread) 448 { 449 PDRVTAP pData = PDMINS2DATA(pDrvIns, PDRVTAP); 450 451 /* Ensure that it does not spin in the CanReceive loop */ 452 if (ASMAtomicXchgU32(&pData->fOutOfSpace, false)) 453 RTSemEventSignal(pData->EventOutOfSpace); 454 455 int rc = RTFileWrite(pData->PipeWrite, "", 1, NULL); 456 AssertRC(rc); 457 458 return VINF_SUCCESS; 459 } 460 461 #else /* !ASYNC_NET */ 462 435 463 /** 436 464 * Poller callback. … … 492 520 STAM_PROFILE_ADV_STOP(&pData->StatReceive, a); 493 521 } 494 #endif 522 #endif /* ASYNC_NET */ 495 523 496 524 … … 922 950 #ifdef ASYNC_NET 923 951 /* 924 * Terminate the Async I/O Thread.925 */926 ASMAtomicXchgSize(&pData->enmState, ASYNCSTATE_TERMINATE);927 if (pData->Thread != NIL_RTTHREAD)928 {929 /* Ensure that it does not spin in the CanReceive loop */930 if (ASMAtomicXchgU32(&pData->fOutOfSpace, false))931 RTSemEventSignal(pData->EventOutOfSpace);932 933 int rc = RTFileWrite(pData->PipeWrite, "", 1, NULL);934 AssertRC(rc);935 rc = RTThreadWait(pData->Thread, 5000, NULL);936 AssertRC(rc);937 pData->Thread = NIL_RTTHREAD;938 }939 940 /*941 952 * Terminate the control pipe. 942 953 */ … … 1025 1036 pData->pszSetupApplication = NULL; 1026 1037 pData->pszTerminateApplication = NULL; 1027 #ifdef ASYNC_NET 1028 pData->Thread = NIL_RTTHREAD; 1029 pData->enmState = ASYNCSTATE_RUNNING; 1030 #endif 1038 1031 1039 /* IBase */ 1032 1040 pDrvIns->IBase.pfnQueryInterface = drvTAPQueryInterface; … … 1160 1168 * Create the async I/O thread. 1161 1169 */ 1162 rc = RTThreadCreate(&pData->Thread, drvTAPAsyncIoThread, pData, 128*_1K, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "TAP");1170 rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pData->pThread, pData, drvTAPAsyncIoThread, drvTapAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "TAP"); 1163 1171 AssertRCReturn(rc, rc); 1164 1172 #else
Note:
See TracChangeset
for help on using the changeset viewer.