VirtualBox

Changeset 14352 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Nov 19, 2008 2:10:24 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
39566
Message:

Additions/HGCM: merged code for HGCMCall and HGCMCallTimed, as per todo

Location:
trunk/src/VBox/Additions/common
Files:
3 edited

Legend:

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

    r14316 r14352  
    389389            pSession->aHGCMClientIds[i] = 0;
    390390            Log(("VBoxGuestCloseSession: disconnecting client id %#RX32\n", Info.u32ClientID));
    391             VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);
     391            VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);
    392392        }
    393393#endif
     
    910910}
    911911
    912 
    913912/**
    914913 * This is a callback for dealing with async waits.
     
    918917static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallback(VMMDevHGCMRequestHeader *pHdr, void *pvUser, uint32_t u32User)
    919918{
    920     const bool fInterruptible = (bool)u32User;
    921919    PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser;
    922920    LogFunc(("requestType=%d\n", pHdr->header.requestType));
    923     VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, pDevExt, fInterruptible, RT_INDEFINITE_WAIT);
    924 }
    925 
     921    VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr,
     922                                         pDevExt, false /* fInterruptible */,
     923                                         RT_INDEFINITE_WAIT);
     924}
    926925
    927926/**
     
    930929 * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent.
    931930 */
    932 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible(VMMDevHGCMRequestHeader *pHdr, void *pvUser, uint32_t u32User)
     931static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackInterruptible(VMMDevHGCMRequestHeader *pHdr,
     932                                                   void *pvUser, uint32_t u32User)
    933933{
    934934    PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser;
    935935    LogFunc(("requestType=%d\n", pHdr->header.requestType));
    936     VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, pDevExt, true /* fInterruptible */, u32User);
    937 }
    938 
    939 
    940 /**
    941  * This is an uninterruptible callback for dealing with async waits with a timeout.
    942  *
    943  * It operates in a manner similar to VBoxGuestCommonIOCtl_WaitEvent.
    944  */
    945 static DECLCALLBACK(void) VBoxGuestHGCMAsyncWaitCallbackTimeout(VMMDevHGCMRequestHeader *pHdr, void *pvUser, uint32_t u32User)
    946 {
    947     PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pvUser;
    948     LogFunc(("requestType=%d\n", pHdr->header.requestType));
    949     VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr, pDevExt, false /* fInterruptible */, u32User);
    950 }
    951 
     936    VBoxGuestHGCMAsyncWaitCallbackWorker((VMMDevHGCMRequestHeader volatile *)pHdr,
     937                                         pDevExt, true /* fInterruptible */,
     938                                         u32User);
     939}
    952940
    953941static int VBoxGuestCommonIOCtl_HGCMConnect(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMConnectInfo *pInfo,
     
    963951         ? pInfo->Loc.u.host.achName : "<not local host>"));
    964952
    965     int rc = VbglHGCMConnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);
     953    int rc = VbglHGCMConnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);
    966954    if (RT_SUCCESS(rc))
    967955    {
     
    993981                Info.result = 0;
    994982                Info.u32ClientID = pInfo->u32ClientID;
    995                 VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);
     983                VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);
    996984                return VERR_TOO_MANY_OPEN_FILES;
    997985            }
     
    10351023     */
    10361024    Log(("VBoxGuestCommonIOCtl: HGCM_DISCONNECT: u32Client=%RX32\n", pInfo->u32ClientID));
    1037     int rc = VbglHGCMDisconnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, false /* uninterruptible */);
     1025    int rc = VbglHGCMDisconnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);
    10381026    if (RT_SUCCESS(rc))
    10391027    {
     
    10531041
    10541042
    1055 /** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCallTimeout. */
    1056 static int VBoxGuestCommonIOCtl_HGCMCall(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMCallInfo *pInfo,
     1043static int VBoxGuestCommonIOCtl_HGCMCall(PVBOXGUESTDEVEXT pDevExt,
     1044                                         PVBOXGUESTSESSION pSession,
     1045                                         VBoxGuestHGCMCallInfo *pInfo,
     1046                                         uint32_t u32Timeout, bool fInterruptible,
    10571047                                         size_t cbData, size_t *pcbDataReturned)
    10581048{
     
    10991089     */
    11001090    Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID));
    1101     int rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, pSession->R0Process != NIL_RTR0PROCESS);
     1091    int rc;
     1092    if (fInterruptible)
     1093        rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackInterruptible, pDevExt,
     1094                          u32Timeout);
     1095    else
     1096        rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, u32Timeout);
    11021097    if (RT_SUCCESS(rc))
    11031098    {
     
    11101105}
    11111106
    1112 
    1113 # ifdef HGCM_TIMEOUT
    1114 /** @remarks Identical to VBoxGuestCommonIOCtl_HGCMCall.
    1115  * @todo r=bird: merge the two.  */
    1116 static int VBoxGuestCommonIOCtl_HGCMCallTimeout(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMCallInfoTimeout *pInfoTimeout,
    1117                                                 size_t cbData, size_t *pcbDataReturned)
    1118 {
    1119     VBoxGuestHGCMCallInfo *pInfo = &pInfoTimeout->info;
    1120     /*
    1121      * Some more validations.
    1122      */
    1123     if (pInfo->cParms > 4096) /* (Just make sure it doesn't overflow the next check.) */
    1124     {
    1125         Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms));
    1126         return VERR_INVALID_PARAMETER;
    1127     }
    1128     const size_t cbActual = sizeof(*pInfoTimeout) + pInfo->cParms * sizeof(HGCMFunctionParameter);
    1129     if (cbData < cbActual)
    1130     {
    1131         Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n",
    1132              cbData, cbActual));
    1133         return VERR_INVALID_PARAMETER;
    1134     }
    1135 
    1136     /*
    1137      * Validate the client id.
    1138      */
    1139     const uint32_t u32ClientId = pInfo->u32ClientID;
    1140     unsigned i;
    1141     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    1142     RTSpinlockAcquireNoInts(pDevExt->SessionSpinlock, &Tmp);
    1143     for (i = 0; i < RT_ELEMENTS(pSession->aHGCMClientIds); i++)
    1144         if (pSession->aHGCMClientIds[i] == u32ClientId)
    1145             break;
    1146     RTSpinlockReleaseNoInts(pDevExt->SessionSpinlock, &Tmp);
    1147     if (RT_UNLIKELY(i >= RT_ELEMENTS(pSession->aHGCMClientIds)))
    1148     {
    1149         static unsigned s_cErrors = 0;
    1150         if (s_cErrors++ > 32)
    1151             LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: Invalid handle. u32Client=%RX32\n", u32ClientId));
    1152         return VERR_INVALID_HANDLE;
    1153     }
    1154 
    1155     /*
    1156      * The VbglHGCMCall call will invoke the callback if the HGCM
    1157      * call is performed in an ASYNC fashion. This function can
    1158      * deal with cancelled requests, so we let user more requests
    1159      * be interruptible (should add a flag for this later I guess).
    1160      */
    1161     Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID));
    1162     int rc;
    1163     if (pSession->R0Process == NIL_RTR0PROCESS)
    1164         rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackTimeout, pDevExt, pInfoTimeout->u32Timeout);
    1165     else
    1166         rc = VbglHGCMCall(pInfo, VBoxGuestHGCMAsyncWaitCallbackTimeoutInterruptible, pDevExt,
    1167                           pInfoTimeout->u32Timeout);
    1168     if (RT_SUCCESS(rc))
    1169     {
    1170         Log(("VBoxGuestCommonIOCtl: HGCM_CALL: result=%Rrc\n", pInfo->result));
    1171         if (pcbDataReturned)
    1172             *pcbDataReturned = cbActual;
    1173     }
    1174     Log(("VBoxGuestCommonIOCtl: HGCM_CALL: Failed. rc=%Rrc.\n", rc));
    1175     return rc;
    1176 }
    1177 # endif /* HGCM_TIMEOUT */
    1178 
    1179 
    11801107/**
    11811108 * @returns VBox status code. Unlike the other HGCM IOCtls this will combine
     
    11961123        Info.result = (uint32_t)VERR_WRONG_ORDER;           /** @todo Vitali, why is this member unsigned? */
    11971124        Info.u32ClientID = pDevExt->u32ClipboardClientId;
    1198         rc = VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, 0);
     1125        rc = VbglHGCMDisconnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);
    11991126        if (RT_SUCCESS(rc))
    12001127        {
     
    12191146    Info.result = (uint32_t)VERR_WRONG_ORDER;
    12201147
    1221     rc = VbglHGCMConnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, 0);
     1148    rc = VbglHGCMConnect(&Info, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);
    12221149    if (RT_FAILURE(rc))
    12231150    {
     
    13231250     * These ones are tricky and can be done later.
    13241251     */
    1325 /**@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. */
    13261252    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL(0)))
    13271253    {
    13281254        CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo));
    1329         rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, cbData, pcbDataReturned);
    1330     }
    1331 # ifdef HGCM_TIMEOUT
    1332     else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMEOUT(0)))
    1333     {
    1334         CHECKRET_MIN_SIZE("HGCM_CALL_TIMEOUT", sizeof(VBoxGuestHGCMCallInfoTimeout));
    1335         rc = VBoxGuestCommonIOCtl_HGCMCallTimeout(pDevExt, pSession, (VBoxGuestHGCMCallInfoTimeout *)pvData, cbData, pcbDataReturned);
    1336     }
    1337 # endif /* HGCM_TIMEOUT */
     1255        bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;
     1256        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData,
     1257                                           RT_INDEFINITE_WAIT, fInterruptible,
     1258                                           cbData, pcbDataReturned);
     1259    }
     1260    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(0)))
     1261    {
     1262        CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed));
     1263        VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData;
     1264        rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info,
     1265                                           pInfo->u32Timeout, !!pInfo->fInterruptible,
     1266                                           cbData, pcbDataReturned);
     1267    }
    13381268#endif /* VBOX_WITH_HGCM */
    13391269    else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_LOG(0)))
  • trunk/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp

    r14207 r14352  
    187187}
    188188
    189 DECLVBGL(int) VbglHGCMCallTimeout (VBGLHGCMHANDLE handle,
    190                                    VBoxGuestHGCMCallInfoTimeout *pData, uint32_t cbData)
     189DECLVBGL(int) VbglHGCMCallTimed (VBGLHGCMHANDLE handle,
     190                                 VBoxGuestHGCMCallInfoTimed *pData, uint32_t cbData)
    191191{
    192192    int rc = VINF_SUCCESS;
    193193
    194     VBGL_HGCM_ASSERTMsg(cbData >= sizeof (VBoxGuestHGCMCallInfoTimeout) + pData->info.cParms * sizeof (HGCMFunctionParameter),
    195                         ("cbData = %d, cParms = %d (calculated size %d)\n", cbData, pData->info.cParms, sizeof (VBoxGuestHGCMCallInfoTimeout) + pData->info.cParms * sizeof (VBoxGuestHGCMCallInfo)));
    196 
    197     if (pData->u32Timeout == RT_INDEFINITE_WAIT)
    198     {
    199         uint32_t cbDataNew = cbData - RT_OFFSETOF(VBoxGuestHGCMCallInfoTimeout, info);
    200         rc = vbglDriverIOCtl (&handle->driver, VBOXGUEST_IOCTL_HGCM_CALL(cbDataNew), &pData->info,
    201                               cbDataNew);
    202     }
    203     else
    204         rc = vbglDriverIOCtl (&handle->driver, VBOXGUEST_IOCTL_HGCM_CALL_TIMEOUT(cbData), pData, cbData);
     194    uint32_t cbExpected =   sizeof (VBoxGuestHGCMCallInfoTimed)
     195                          + pData->info.cParms * sizeof (HGCMFunctionParameter);
     196    VBGL_HGCM_ASSERTMsg(cbData >= cbExpected,
     197                        ("cbData = %d, cParms = %d (calculated size %d)\n",
     198                        cbData, pData->info.cParms, cbExpected));
     199
     200    rc = vbglDriverIOCtl (&handle->driver, VBOXGUEST_IOCTL_HGCM_CALL_TIMED(cbData),
     201                          pData, cbData);
    205202
    206203    return rc;
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp

    r14214 r14352  
    846846    Msg.size.SetUInt32(0);
    847847
    848     int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL_TIMEOUT(sizeof(Msg)), &Msg, sizeof(Msg));
     848    int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(sizeof(Msg)), &Msg, sizeof(Msg));
    849849    if (RT_SUCCESS(rc))
    850850        rc = Msg.hdr.info.result;
Note: See TracChangeset for help on using the changeset viewer.

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