VirtualBox

Changeset 6931 in vbox for trunk/src/VBox/Devices/Network


Ignore:
Timestamp:
Feb 13, 2008 12:53:15 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
28086
Message:

Converted the TAP async thread to a PDMDrvThread

File:
1 edited

Legend:

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

    r6300 r6931  
    125125    /** The read end of the control pipe. */
    126126    RTFILE                  PipeRead;
    127     /** The thread state. */
    128     ASYNCSTATE volatile     enmState;
    129127    /** Reader thread. */
    130     RTTHREAD                Thread;
     128    PPDMTHREAD              pThread;
    131129    /** We are waiting for more receive buffers. */
    132130    uint32_t volatile       fOutOfSpace;
     
    282280 * @param   pvUser          Pointer to a DRVTAP structure.
    283281 */
    284 static DECLCALLBACK(int) drvTAPAsyncIoThread(RTTHREAD ThreadSelf, void *pvUser)
    285 {
    286     PDRVTAP pData = (PDRVTAP)pvUser;
     282static DECLCALLBACK(int) drvTAPAsyncIoThread(PPDMDRVINS pDrvIns, PPDMTHREAD pThread)
     283{
     284    PDRVTAP pData = PDMINS2DATA(pDrvIns, PDRVTAP);
    287285    LogFlow(("drvTAPAsyncIoThread: pData=%p\n", pData));
     286
     287    if (pThread->enmState == PDMTHREADSTATE_INITIALIZING)
     288        return VINF_SUCCESS;
     289
    288290    STAM_PROFILE_ADV_START(&pData->StatReceive, a);
    289291
     
    294296     * Polling loop.
    295297     */
    296     for (;;)
     298    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
    297299    {
    298300        /*
     
    309311        errno=0;
    310312        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
    311318        STAM_PROFILE_ADV_START(&pData->StatReceive, a);
    312319        if (    rc > 0
     
    350357                    STAM_PROFILE_START(&pData->StatRecvOverflows, b);
    351358                    while (   cbMax == 0
    352                            && pData->enmState != ASYNCSTATE_TERMINATE)
     359                           && pThread->enmState == PDMTHREADSTATE_RUNNING)
    353360                    {
    354361                        LogFlow(("drvTAPAsyncIoThread: cbMax=%d cbRead=%d waiting...\n", cbMax, cbRead));
     
    365372                    STAM_PROFILE_STOP(&pData->StatRecvOverflows, b);
    366373                    STAM_PROFILE_ADV_START(&pData->StatReceive, a);
    367                     if (pData->enmState == ASYNCSTATE_TERMINATE)
     374                    if (pThread->enmState == PDMTHREADSTATE_RUNNING)
    368375                        break;
    369376                }
     
    397404                 && aFDs[1].revents)
    398405        {
    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));
    402407            if (aFDs[1].revents & (POLLHUP | POLLERR | POLLNVAL))
    403408                break;
     
    432437}
    433438
    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 */
     447static 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
    435463/**
    436464 * Poller callback.
     
    492520    STAM_PROFILE_ADV_STOP(&pData->StatReceive, a);
    493521}
    494 #endif
     522#endif /* ASYNC_NET */
    495523
    496524
     
    922950#ifdef ASYNC_NET
    923951    /*
    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     /*
    941952     * Terminate the control pipe.
    942953     */
     
    10251036    pData->pszSetupApplication          = NULL;
    10261037    pData->pszTerminateApplication      = NULL;
    1027 #ifdef ASYNC_NET
    1028     pData->Thread                       = NIL_RTTHREAD;
    1029     pData->enmState                     = ASYNCSTATE_RUNNING;
    1030 #endif
     1038
    10311039    /* IBase */
    10321040    pDrvIns->IBase.pfnQueryInterface    = drvTAPQueryInterface;
     
    11601168     * Create the async I/O thread.
    11611169     */
    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");
    11631171    AssertRCReturn(rc, rc);
    11641172#else
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