| 921 | | |
|---|
| 922 | | # ifdef HGCM_TIMEOUT |
|---|
| 923 | | /** |
|---|
| 924 | | * This is a callback for dealing with async waits with a timeout. |
|---|
| 925 | | * |
|---|
| 926 | | * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. |
|---|
| 927 | | * @todo r=bird: merge VBoxGuestHGCMAsyncWaitCallbackTimeout into |
|---|
| 928 | | * VBoxGuestHGCMAsyncWaitCallback, either by using a stack argument or |
|---|
| 929 | | * (better) create a common worker for them |
|---|
| 930 | | */ |
|---|
| 931 | | static DECLCALLBACK(void) |
|---|
| 932 | | VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdrNonVolatile, void *pvUser, uint32_t u32User) |
|---|
| | 922 | # else /* HGCM_TIMEOUT defined */ |
|---|
| | 923 | /** Worker for VBoxGuestHGCMAsyncWaitCallback* */ |
|---|
| | 924 | void |
|---|
| | 925 | VBoxGuestHGCMAsyncWaitCallbackWorker(VMMDevHGCMRequestHeader *pHdrNonVolatile, PVBOXGUESTDEVEXT pDevExt, |
|---|
| | 926 | bool fInterruptible, uint32_t u32Timeout) |
|---|
| | 990 | } |
|---|
| | 991 | |
|---|
| | 992 | /** |
|---|
| | 993 | * This is a callback for dealing with async waits. |
|---|
| | 994 | * |
|---|
| | 995 | * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. |
|---|
| | 996 | */ |
|---|
| | 997 | static DECLCALLBACK(void) |
|---|
| | 998 | VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdrNonVolatile, void *pvUser, uint32_t u32User) |
|---|
| | 999 | { |
|---|
| | 1000 | VMMDevHGCMRequestHeader volatile *pHdr = (VMMDevHGCMRequestHeader volatile *)pHdrNonVolatile; |
|---|
| | 1001 | const bool fInterruptible = (bool)u32User; |
|---|
| | 1002 | PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; |
|---|
| | 1003 | LogFunc(("requestType=%d\n", pHdr->header.requestType)); |
|---|
| | 1004 | VBoxGuestHGCMAsyncWaitCallbackWorker(pHdrNonVolatile, pDevExt, fInterruptible, RT_INDEFINITE_WAIT); |
|---|
| | 1005 | } |
|---|
| | 1006 | |
|---|
| | 1007 | /** |
|---|
| | 1008 | * This is a callback for dealing with async waits with a timeout. |
|---|
| | 1009 | * |
|---|
| | 1010 | * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. |
|---|
| | 1011 | */ |
|---|
| | 1012 | static DECLCALLBACK(void) |
|---|
| | 1013 | VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible(VMMDevHGCMRequestHeader *pHdrNonVolatile, |
|---|
| | 1014 | void *pvUser, uint32_t u32User) |
|---|
| | 1015 | { |
|---|
| | 1016 | PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; |
|---|
| | 1017 | LogFunc(("requestType=%d\n", pHdr->header.requestType)); |
|---|
| | 1018 | VBoxGuestHGCMAsyncWaitCallbackWorker(pHdrNonVolatile, pDevExt, true, u32user); |
|---|
| | 1019 | } |
|---|
| | 1020 | |
|---|
| | 1021 | /** |
|---|
| | 1022 | * This is an uninterruptible callback for dealing with async waits with a timeout. |
|---|
| | 1023 | * |
|---|
| | 1024 | * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent. |
|---|
| | 1025 | */ |
|---|
| | 1026 | static DECLCALLBACK(void) |
|---|
| | 1027 | VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdrNonVolatile, void *pvUser, |
|---|
| | 1028 | uint32_t u32User) |
|---|
| | 1029 | { |
|---|
| | 1030 | PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser; |
|---|
| | 1031 | LogFunc(("requestType=%d\n", pHdr->header.requestType)); |
|---|
| | 1032 | VBoxGuestHGCMAsyncWaitCallbackWorker(pHdrNonVolatile, pDevExt, false, u32user); |
|---|
| 1207 | | int rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackTimeout, pDevExt, pInfoTimeout->u32Timeout); |
|---|
| | 1245 | int rc; |
|---|
| | 1246 | if (pSession->R0Process == NIL_RTR0PROCESS) |
|---|
| | 1247 | rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackTimeout, pDevExt, pInfoTimeout->u32Timeout); |
|---|
| | 1248 | else |
|---|
| | 1249 | rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible, pDevExt, |
|---|
| | 1250 | pInfoTimeout->u32Timeout); |
|---|