- Timestamp:
- Feb 10, 2014 10:22:43 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxNetSend.h
r50322 r50379 25 25 */ 26 26 27 #ifndef __VBoxNetSend_h__ 28 #define __VBoxNetSend_h__ 27 /** @todo move this to src/VBox/HostDrivers/darwin as a .cpp file. */ 28 #ifndef ___VBox_VBoxNetSend_h 29 #define ___VBox_VBoxNetSend_h 29 30 30 31 #if defined(RT_OS_DARWIN) 31 32 32 # include <iprt/err.h>33 # include <iprt/assert.h>34 # include <iprt/string.h>33 # include <iprt/err.h> 34 # include <iprt/assert.h> 35 # include <iprt/string.h> 35 36 36 # include <sys/socket.h>37 # include <net/kpi_interface.h>37 # include <sys/socket.h> 38 # include <net/kpi_interface.h> 38 39 RT_C_DECLS_BEGIN /* Buggy 10.4 headers, fixed in 10.5. */ 39 # include <sys/kpi_mbuf.h>40 # include <sys/kpi_mbuf.h> 40 41 RT_C_DECLS_END 41 # include <net/if.h>42 # include <net/if.h> 42 43 43 44 RT_C_DECLS_BEGIN 44 45 45 # if defined(IN_RING0)46 # if defined(IN_RING0) 46 47 47 48 /** 48 * Constructs and submits a dummy packet to ifnet_input(). This is a workaround 49 * for "stuck dock icon" issue. When the first packet goes through the interface 50 * DLIL grabs a reference to the thread that submits the packet and holds it 51 * until the interface is destroyed. By submitting this dummy we make DLIL grab 52 * the thread of a non-GUI process. 49 * Constructs and submits a dummy packet to ifnet_input(). 50 * 51 * This is a workaround for "stuck dock icon" issue. When the first packet goes 52 * through the interface DLIL grabs a reference to the thread that submits the 53 * packet and holds it until the interface is destroyed. By submitting this 54 * dummy we make DLIL grab the thread of a non-GUI process. 53 55 * 54 56 * Most of this function was copied from vboxNetFltDarwinMBufFromSG(). … … 58 60 * thread. We submit dummy as if it was coming from this interface. 59 61 */ 60 inline intVBoxNetSendDummy(ifnet_t pIfNet)62 DECLINLINE(int) VBoxNetSendDummy(ifnet_t pIfNet) 61 63 { 62 int rc = 0; 63 size_t cbTotal = 50; /* No Ethernet header */ 64 mbuf_how_t How = MBUF_WAITOK; 64 int rc = VINF_SUCCESS; 65 65 66 mbuf_t pPkt = NULL; 66 size_t cbTotal = 50; /* No Ethernet header */ 67 mbuf_how_t How = MBUF_WAITOK; 68 mbuf_t pPkt = NULL; 67 69 errno_t err = mbuf_allocpacket(How, cbTotal, NULL, &pPkt); 68 70 if (!err) … … 96 98 } 97 99 98 # endif /* IN_RING0 */100 # endif /* IN_RING0 */ 99 101 100 102 RT_C_DECLS_END … … 102 104 #endif /* RT_OS_DARWIN */ 103 105 104 #endif /* __VBoxNetSend_h__ */ 106 #endif /* !___VBox_VBoxNetSend_h */ 107 -
trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
r50322 r50379 885 885 886 886 887 /** A worker for vboxNetFltSendDummy() thread. */888 static int vboxNetFltSendDummyWorker(RTTHREADThreadSelf, void *pvUser)887 /** A worker thread for vboxNetFltSendDummy(). */ 888 static DECLCALLBACK(int) vboxNetFltSendDummyWorker(RTTHREAD hThreadSelf, void *pvUser) 889 889 { 890 890 Assert(pvUser); … … 893 893 } 894 894 895 /* 895 896 /** 896 897 * Prevent GUI icon freeze issue when VirtualBoxVM process terminates. 897 898 * 898 * This function is a workaround for stuck-in-dock issue. The 899 * idea here is to send a dummy packet to an interface from the 900 * context of a kernel thread. Therefore, an XNU's receive 901 * thread (which is created as a result if we are the first who 902 * is communicating with the interface) will be associated with the 903 * kernel thread instead of VirtualBoxVM process. 899 * This function is a workaround for stuck-in-dock issue. The idea here is to 900 * send a dummy packet to an interface from the context of a kernel thread. 901 * Therefore, an XNU's receive thread (which is created as a result if we are 902 * the first who is communicating with the interface) will be associated with 903 * the kernel thread instead of VirtualBoxVM process. 904 904 * 905 905 * @param pIfNet Interface to be used to send data. … … 907 907 static void vboxNetFltSendDummy(ifnet_t pIfNet) 908 908 { 909 RTTHREAD dummyThread; 910 int rc; 911 912 rc = RTThreadCreate(&dummyThread, vboxNetFltSendDummyWorker, (void *)pIfNet, 0, 913 RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "DummyThread"); 914 909 RTTHREAD hThread; 910 int rc = RTThreadCreate(&hThread, vboxNetFltSendDummyWorker, (void *)pIfNet, 0, 911 RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "DummyThread"); 915 912 if (RT_SUCCESS(rc)) 916 913 { 917 RTThreadWait( dummyThread, RT_INDEFINITE_WAIT, NULL);914 RTThreadWait(hThread, RT_INDEFINITE_WAIT, NULL); 918 915 LogFlow(("vboxNetFltSendDummy: a dummy packet has been successfully sent in order to prevent stuck-in-dock issue\n")); 919 916 } … … 921 918 LogFlow(("vboxNetFltSendDummy: unable to send dummy packet in order to prevent stuck-in-dock issue\n")); 922 919 } 920 923 921 924 922 /** … … 957 955 RTSpinlockReleaseNoInts(pThis->hSpinlock); 958 956 959 /* Prevent stuck-in-dock issue by associating interface receive thread with kernel thread */957 /* Prevent stuck-in-dock issue by associating interface receive thread with kernel thread. */ 960 958 vboxNetFltSendDummy(pIfNet); 961 959
Note:
See TracChangeset
for help on using the changeset viewer.