Changeset 107214 in vbox
- Timestamp:
- Dec 3, 2024 6:30:05 AM (4 months ago)
- svn:sync-xref-src-repo-rev:
- 166218
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvNATlibslirp.cpp
r107213 r107214 40 40 # define inet_aton(x, y) inet_pton(2, x, y) 41 41 # define AF_INET6 23 42 # define poll WSAPoll 42 43 #endif 43 44 … … 741 742 * To prevent concurrent execution of sending/receiving threads 742 743 */ 743 #ifndef RT_OS_WINDOWS 744 744 745 uint32_t uTimeout = DRVNAT_DEFAULT_TIMEOUT; 745 746 pThis->pNATState->nsock = 1; … … 749 750 750 751 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 751 756 752 757 if (cChangedFDs < 0) 753 758 { 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 754 763 if (errno == EINTR) 755 764 { … … 763 772 cPollNegRet = 0; 764 773 } 774 #endif 765 775 } 766 776 767 777 Log4(("%s: poll\n", __FUNCTION__)); 768 778 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 769 783 if (pThis->pNATState->polls[0].revents & (POLLRDNORM|POLLPRI|POLLRDBAND)) 784 #endif 770 785 { 771 786 /* drain the pipe … … 778 793 size_t cbRead; 779 794 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 780 798 RTPipeRead(pThis->hPipeRead, &ch[0], RT_MIN(cbWakeupNotifs, 1024), &cbRead); 799 #endif 781 800 ASMAtomicSubU64(&pThis->cbWakeupNotifs, cbRead); 782 801 } 802 783 803 784 804 /* process _all_ outstanding requests but don't wait */ 785 805 RTReqQueueProcess(pThis->hSlirpReqQueue, 0); 786 806 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 pipe805 *806 * Note! drvNATSend decoupled so we don't know how many times807 * device's thread sends before we've entered multiplex,808 * so to avoid false alarm drain pipe here to the very end809 */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 */832 807 } 833 808
Note:
See TracChangeset
for help on using the changeset viewer.