Changeset 14311 in vbox
- Timestamp:
- Nov 18, 2008 3:41:29 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 39502
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
r14310 r14311 838 838 } 839 839 840 841 840 #ifdef VBOX_WITH_HGCM 842 841 843 # ifndef HGCM_TIMEOUT 844 /** 845 * This is a callback for dealing with async waits. 846 * 847 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. 848 */ 849 static DECLCALLBACK(void) 850 VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdrNonVolatile, void *pvUser, uint32_t u32User) 842 /** Worker for VBoxGuestHGCMAsyncWaitCallback*. */ 843 void 844 VBoxGuestHGCMAsyncWaitCallbackWorker(VMMDevHGCMRequestHeader *pHdrNonVolatile, PVBOXGUESTDEVEXT pDevExt, 845 bool fInterruptible, uint32_t u32Timeout) 851 846 { 852 847 VMMDevHGCMRequestHeader volatile *pHdr = (VMMDevHGCMRequestHeader volatile *)pHdrNonVolatile; 853 const bool fInterruptible = (bool)u32User;854 PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser;855 Log(("VBoxGuestHGCMAsyncWaitCallback: requestType=%d\n", pHdr->header.requestType));856 848 857 849 /* … … 901 893 int rc; 902 894 if (fInterruptible) 903 rc = RTSemEventMultiWaitNoResume(pWait->Event, RT_INDEFINITE_WAIT);895 rc = RTSemEventMultiWaitNoResume(pWait->Event, u32Timeout); 904 896 else 905 rc = RTSemEventMultiWait(pWait->Event, RT_INDEFINITE_WAIT);897 rc = RTSemEventMultiWait(pWait->Event, u32Timeout); 906 898 907 899 /* … … 920 912 } 921 913 922 # else /* HGCM_TIMEOUT */923 /** Worker for VBoxGuestHGCMAsyncWaitCallback* */924 void925 VBoxGuestHGCMAsyncWaitCallbackWorker(VMMDevHGCMRequestHeader *pHdrNonVolatile, PVBOXGUESTDEVEXT pDevExt,926 bool fInterruptible, uint32_t u32Timeout)927 {928 VMMDevHGCMRequestHeader volatile *pHdr = (VMMDevHGCMRequestHeader volatile *)pHdrNonVolatile;929 930 /*931 * Check to see if the condition was met by the time we got here.932 *933 * We create a simple poll loop here for dealing with out-of-memory934 * conditions since the caller isn't necessarily able to deal with935 * us returning too early.936 */937 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;938 PVBOXGUESTWAIT pWait;939 for (;;)940 {941 RTSpinlockAcquireNoInts(pDevExt->WaitSpinlock, &Tmp);942 if ((pHdr->fu32Flags & VBOX_HGCM_REQ_DONE) != 0)943 {944 RTSpinlockReleaseNoInts(pDevExt->WaitSpinlock, &Tmp);945 return;946 }947 RTSpinlockReleaseNoInts(pDevExt->WaitSpinlock, &Tmp);948 949 pWait = VBoxGuestWaitAlloc(pDevExt);950 if (pWait)951 break;952 if (fInterruptible)953 return;954 RTThreadSleep(1);955 }956 pWait->fReqEvents = VMMDEV_EVENT_HGCM;957 pWait->pHGCMReq = pHdr;958 959 /*960 * Re-enter the spinlock and re-check for the condition.961 * If the condition is met, return.962 * Otherwise link us into the HGCM wait list and go to sleep.963 */964 RTSpinlockAcquireNoInts(pDevExt->WaitSpinlock, &Tmp);965 if ((pHdr->fu32Flags & VBOX_HGCM_REQ_DONE) != 0)966 {967 VBoxGuestWaitFreeLocked(pDevExt, pWait);968 RTSpinlockReleaseNoInts(pDevExt->WaitSpinlock, &Tmp);969 return;970 }971 VBoxGuestWaitAppend(&pDevExt->HGCMWaitList, pWait);972 RTSpinlockReleaseNoInts(pDevExt->WaitSpinlock, &Tmp);973 974 int rc;975 if (fInterruptible)976 rc = RTSemEventMultiWaitNoResume(pWait->Event, u32Timeout);977 else978 rc = RTSemEventMultiWait(pWait->Event, u32Timeout);979 980 /*981 * This shouldn't ever return failure...982 * Unlink, free and return.983 */984 if (rc == VERR_SEM_DESTROYED)985 return;986 if (RT_FAILURE(rc))987 LogRel(("VBoxGuestHGCMAsyncWaitCallback: wait failed! %Rrc\n", rc));988 989 RTSpinlockAcquireNoInts(pDevExt->WaitSpinlock, &Tmp);990 VBoxGuestWaitUnlink(&pDevExt->HGCMWaitList, pWait);991 VBoxGuestWaitFreeLocked(pDevExt, pWait);992 RTSpinlockReleaseNoInts(pDevExt->WaitSpinlock, &Tmp);993 }994 995 914 996 915 /** … … 999 918 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. 1000 919 */ 1001 static DECLCALLBACK(void) 1002 VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdrNonVolatile,void *pvUser, uint32_t u32User)920 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdrNonVolatile, 921 void *pvUser, uint32_t u32User) 1003 922 { 1004 923 VMMDevHGCMRequestHeader volatile *pHdr = (VMMDevHGCMRequestHeader volatile *)pHdrNonVolatile; … … 1015 934 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. 1016 935 */ 1017 static DECLCALLBACK(void) 1018 VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible(VMMDevHGCMRequestHeader *pHdrNonVolatile, 1019 void *pvUser, uint32_t u32User) 936 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible(VMMDevHGCMRequestHeader *pHdrNonVolatile, 937 void *pvUser, uint32_t u32User) 1020 938 { 1021 939 PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; … … 1030 948 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. 1031 949 */ 1032 static DECLCALLBACK(void) 1033 VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdrNonVolatile, void *pvUser, 1034 uint32_t u32User) 950 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdrNonVolatile, 951 void *pvUser, uint32_t u32User) 1035 952 { 1036 953 PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; … … 1038 955 VBoxGuestHGCMAsyncWaitCallbackWorker(pHdrNonVolatile, pDevExt, false /* fInterruptible */, u32user); 1039 956 } 1040 # endif /* HGCM_TIMEOUT */1041 957 1042 958 … … 1202 1118 1203 1119 # ifdef HGCM_TIMEOUT 1204 /** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCall. */ 1120 /** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCall. 1121 * @todo r=bird: merge the two. */ 1205 1122 static int VBoxGuestCommonIOCtl_HGCMCallTimeout(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMCallInfoTimeout *pInfoTimeout, 1206 1123 size_t cbData, size_t *pcbDataReturned) … … 1331 1248 1332 1249 #endif /* VBOX_WITH_HGCM */ 1333 1334 1250 1335 1251 /** … … 1413 1329 * These ones are tricky and can be done later. 1414 1330 */ 1331 /**@todo r=bird: Merge the handling of these two. The only difference is that the 2nd has one or two extra argument preceeding the call info. */ 1415 1332 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL(0))) 1416 1333 {
Note:
See TracChangeset
for help on using the changeset viewer.