VirtualBox

Changeset 14311 in vbox


Ignore:
Timestamp:
Nov 18, 2008 3:41:29 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
39502
Message:

VBoxGuest.cpp: r=bird, enabled the code (be bold).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp

    r14310 r14311  
    838838}
    839839
    840 
    841840#ifdef VBOX_WITH_HGCM
    842841
    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*. */
     843void
     844VBoxGuestHGCMAsyncWaitCallbackWorker(VMMDevHGCMRequestHeader *pHdrNonVolatile, PVBOXGUESTDEVEXT pDevExt,
     845                                     bool fInterruptible, uint32_t u32Timeout)
    851846{
    852847    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));
    856848
    857849    /*
     
    901893    int rc;
    902894    if (fInterruptible)
    903         rc = RTSemEventMultiWaitNoResume(pWait->Event, RT_INDEFINITE_WAIT);
     895        rc = RTSemEventMultiWaitNoResume(pWait->Event, u32Timeout);
    904896    else
    905         rc = RTSemEventMultiWait(pWait->Event, RT_INDEFINITE_WAIT);
     897        rc = RTSemEventMultiWait(pWait->Event, u32Timeout);
    906898
    907899    /*
     
    920912}
    921913
    922 # else /* HGCM_TIMEOUT */
    923 /** Worker for VBoxGuestHGCMAsyncWaitCallback* */
    924 void
    925 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-memory
    934      * conditions since the caller isn't necessarily able to deal with
    935      * 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     else
    978         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 
    995914
    996915/**
     
    999918 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent.
    1000919 */
    1001 static DECLCALLBACK(void)
    1002 VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdrNonVolatile, void *pvUser, uint32_t u32User)
     920static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdrNonVolatile,
     921                                                        void *pvUser, uint32_t u32User)
    1003922{
    1004923    VMMDevHGCMRequestHeader volatile *pHdr = (VMMDevHGCMRequestHeader volatile *)pHdrNonVolatile;
     
    1015934 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent.
    1016935 */
    1017 static DECLCALLBACK(void)
    1018 VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible(VMMDevHGCMRequestHeader *pHdrNonVolatile,
    1019                                                    void *pvUser, uint32_t u32User)
     936static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible(VMMDevHGCMRequestHeader *pHdrNonVolatile,
     937                                                                             void *pvUser, uint32_t u32User)
    1020938{
    1021939    PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser;
     
    1030948 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent.
    1031949 */
    1032 static DECLCALLBACK(void)
    1033 VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdrNonVolatile, void *pvUser,
    1034                                       uint32_t u32User)
     950static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdrNonVolatile,
     951                                                                void *pvUser, uint32_t u32User)
    1035952{
    1036953    PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser;
     
    1038955    VBoxGuestHGCMAsyncWaitCallbackWorker(pHdrNonVolatile, pDevExt, false /* fInterruptible */, u32user);
    1039956}
    1040 # endif /* HGCM_TIMEOUT */
    1041957
    1042958
     
    12021118
    12031119# ifdef HGCM_TIMEOUT
    1204 /** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCall. */
     1120/** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCall.
     1121 * @todo r=bird: merge the two.  */
    12051122static int VBoxGuestCommonIOCtl_HGCMCallTimeout(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMCallInfoTimeout *pInfoTimeout,
    12061123                                                size_t cbData, size_t *pcbDataReturned)
     
    13311248
    13321249#endif /* VBOX_WITH_HGCM */
    1333 
    13341250
    13351251/**
     
    14131329     * These ones are tricky and can be done later.
    14141330     */
     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. */
    14151332    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL(0)))
    14161333    {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette