VirtualBox

Changeset 107214 in vbox


Ignore:
Timestamp:
Dec 3, 2024 6:30:05 AM (4 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
166218
Message:

NAT: unified platform specific code paths in io thread. bugref:10268

File:
1 edited

Legend:

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

    r107213 r107214  
    4040# define inet_aton(x, y) inet_pton(2, x, y)
    4141# define AF_INET6 23
     42# define poll WSAPoll
    4243#endif
    4344
     
    741742         * To prevent concurrent execution of sending/receiving threads
    742743         */
    743 #ifndef RT_OS_WINDOWS
     744
    744745        uint32_t uTimeout = DRVNAT_DEFAULT_TIMEOUT;
    745746        pThis->pNATState->nsock = 1;
     
    749750
    750751        int cChangedFDs = poll(pThis->pNATState->polls, pThis->pNATState->nsock, uTimeout /* timeout */);
     752#ifdef RT_OS_WINDOWS
     753        /* Note: This must be called IMMEDIATELY after poll/WSAPoll. */
     754        int error = WSAGetLastError();
     755#endif
    751756
    752757        if (cChangedFDs < 0)
    753758        {
     759#ifdef RT_OS_WINDOWS
     760            LogRel(("NAT: RTWinPoll returned error=%Rrc (cChangedFDs=%d)\n", error, cChangedFDs));
     761            Log4(("NAT: NSOCK = %d\n", pThis->pNATState->nsock));
     762#else
    754763            if (errno == EINTR)
    755764            {
     
    763772                cPollNegRet = 0;
    764773            }
     774#endif
    765775        }
    766776
    767 
     777        Log4(("%s: poll\n", __FUNCTION__));
    768778        slirp_pollfds_poll(pThis->pNATState->pSlirp, cChangedFDs < 0, drvNAT_GetREventsCb /* SlirpGetREventsCb */, pThis /* opaque */);
     779
     780#ifdef RT_OS_WINDOWS
     781        if (pThis->pNATState->polls[0].revents & (POLLIN))
     782#else
    769783        if (pThis->pNATState->polls[0].revents & (POLLRDNORM|POLLPRI|POLLRDBAND))
     784#endif
    770785        {
    771786            /* drain the pipe
     
    778793            size_t cbRead;
    779794            uint64_t cbWakeupNotifs = ASMAtomicReadU64(&pThis->cbWakeupNotifs);
     795#ifdef RT_OS_WINDOWS
     796            cbRead = recv(pThis->pWakeupSockPair[1], &ch[0], RT_MIN(cbWakeupNotifs, 1024), NULL);
     797#else
    780798            RTPipeRead(pThis->hPipeRead, &ch[0], RT_MIN(cbWakeupNotifs, 1024), &cbRead);
     799#endif
    781800            ASMAtomicSubU64(&pThis->cbWakeupNotifs, cbRead);
    782801        }
     802
    783803
    784804        /* process _all_ outstanding requests but don't wait */
    785805        RTReqQueueProcess(pThis->hSlirpReqQueue, 0);
    786806        drvNAT_CheckTimeout(pThis);
    787 
    788 #else /* RT_OS_WINDOWS */
    789         uint32_t msTimeout = DRVNAT_DEFAULT_TIMEOUT;
    790         pThis->pNATState->nsock = 1;
    791         slirp_pollfds_fill(pThis->pNATState->pSlirp, &msTimeout, drvNAT_AddPollCb /* SlirpAddPollCb */, pThis /* opaque */);
    792         drvNAT_UpdateTimeout(&msTimeout, pThis);
    793 
    794         int cChangedFDs = WSAPoll(pThis->pNATState->polls, pThis->pNATState->nsock, msTimeout /* timeout */);
    795         int error = WSAGetLastError();
    796         if (cChangedFDs == SOCKET_ERROR)
    797         {
    798             LogRel(("NAT: RTWinPoll returned error=%Rrc (cChangedFDs=%d)\n", error, cChangedFDs));
    799             Log4(("NAT: NSOCK = %d\n", pThis->pNATState->nsock));
    800         }
    801 
    802         if (pThis->pNATState->polls[0].revents & (POLLIN))
    803         {
    804             /* drain the pipe
    805              *
    806              * Note! drvNATSend decoupled so we don't know how many times
    807              * device's thread sends before we've entered multiplex,
    808              * so to avoid false alarm drain pipe here to the very end
    809              */
    810             char ch[1024];
    811             size_t cbRead;
    812             uint64_t cbWakeupNotifs = ASMAtomicReadU64(&pThis->cbWakeupNotifs);
    813             cbRead = recv(pThis->pWakeupSockPair[1], &ch[0], RT_MIN(cbWakeupNotifs, 1024), NULL);
    814             ASMAtomicSubU64(&pThis->cbWakeupNotifs, cbRead);
    815         }
    816 
    817         if (cChangedFDs == 0)
    818         {
    819             /* only check for slow/fast timers */
    820             slirp_pollfds_poll(pThis->pNATState->pSlirp, false /*select error*/, drvNAT_GetREventsCb /* SlirpGetREventsCb */, pThis /* opaque */);
    821             RTReqQueueProcess(pThis->hSlirpReqQueue, 0);
    822             continue;
    823         }
    824         /* poll the sockets in any case */
    825         Log2(("%s: poll\n", __FUNCTION__));
    826         slirp_pollfds_poll(pThis->pNATState->pSlirp, cChangedFDs < 0 /*select error*/, drvNAT_GetREventsCb /* SlirpGetREventsCb */, pThis /* opaque */);
    827 
    828         /* process _all_ outstanding requests but don't wait */
    829         RTReqQueueProcess(pThis->hSlirpReqQueue, 0);
    830         drvNAT_CheckTimeout(pThis);
    831 #endif /* RT_OS_WINDOWS */
    832807    }
    833808
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