VirtualBox

Changeset 98818 in vbox for trunk


Ignore:
Timestamp:
Mar 2, 2023 1:52:48 PM (19 months ago)
Author:
vboxsync
Message:

Guest Control: Specify the directory reading parameters (additional attributes + reading flags) when opening the directory calls, not on every directory entry read. Should save a few bytes on every read. bugref:9783

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/HostServices/GuestControlSvc.h

    r98792 r98818  
    10331033    /** Directory open flags (GSTCTLDIR_F_XXX). */
    10341034    HGCMFunctionParameter flags;
     1035    /** Additional directory attributes to use
     1036     *  (GSTCTLFSOBJATTRADD, for subsequent directory entry read calls). */
     1037    HGCMFunctionParameter read_attr_add;
     1038    /** Directory reading flags (for subsequent directory entry read calls).
     1039     *  GSTCTL_PATH_F_ON_LINK or GSTCTL_PATH_F_FOLLOW_LINK. */
     1040    HGCMFunctionParameter read_flags;
    10351041} HGCMMsgDirOpen;
    10361042
     
    10601066     *  @sa GSTCTL_DIRENTRY_MAX_SIZE */
    10611067    HGCMFunctionParameter max_entry_size;
    1062     /** Additional directory attributes to use (GSTCTLFSOBJATTRADD). */
    1063     HGCMFunctionParameter add_attributes;
    1064     /** Directory reading flags.
    1065      *  GSTCTL_PATH_F_ON_LINK or GSTCTL_PATH_F_FOLLOW_LINK. */
    1066     HGCMFunctionParameter flags;
    10671068} HGCMMsgDirRead;
    10681069
  • trunk/include/VBox/VBoxGuestLib.h

    r98817 r98818  
    11181118 */
    11191119VBGLR3DECL(int) VbglR3GuestCtrlDirGetCreate(PVBGLR3GUESTCTRLCMDCTX pCtx, char *pszPath, uint32_t cbPath, uint32_t *pfMode, uint32_t *pfFlags);
    1120 VBGLR3DECL(int) VbglR3GuestCtrlDirGetOpen(PVBGLR3GUESTCTRLCMDCTX pCtx, char *pszPath, uint32_t cbPath, uint32_t *pfFlags, GSTCTLDIRFILTER *penmFilter);
     1120VBGLR3DECL(int) VbglR3GuestCtrlDirGetOpen(PVBGLR3GUESTCTRLCMDCTX pCtx, char *pszPath, uint32_t cbPath, uint32_t *pfFlags, GSTCTLDIRFILTER *penmFilter, GSTCTLFSOBJATTRADD *penmReadAttrAdd, uint32_t *pfReadFlags);
    11211121VBGLR3DECL(int) VbglR3GuestCtrlDirGetClose(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle);
    1122 VBGLR3DECL(int) VbglR3GuestCtrlDirGetRead(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle, uint32_t *pcbDirEntry, uint32_t *penmAddAttrib, uint32_t *pfFlags);
     1122VBGLR3DECL(int) VbglR3GuestCtrlDirGetRead(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle, uint32_t *pcbDirEntry);
    11231123VBGLR3DECL(int) VbglR3GuestCtrlDirGetRewind(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle);
    11241124/** @} */
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibGuestCtrl.cpp

    r98817 r98818  
    990990 * @param   pfFlags             Where to return the directory listing flags.
    991991 * @param   enmFilter           Where to return the directory filter type.
     992 * @param   penmAttrAdd         Where to return the additional attributes enumeration to use for reading directory entries later.
     993 * @param   pfReadFlags         Where to return the flags for reading directory entries later.
    992994 */
    993995VBGLR3DECL(int) VbglR3GuestCtrlDirGetOpen(PVBGLR3GUESTCTRLCMDCTX pCtx, char *pszPath, uint32_t cbPath, uint32_t *pfFlags,
    994                                           GSTCTLDIRFILTER *penmFilter)
    995 {
    996     AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
    997     AssertReturn(pCtx->uNumParms == 4, VERR_INVALID_PARAMETER);
     996                                          GSTCTLDIRFILTER *penmFilter, GSTCTLFSOBJATTRADD *penmReadAttrAdd, uint32_t *pfReadFlags)
     997{
     998    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
     999    AssertReturn(pCtx->uNumParms == 6, VERR_INVALID_PARAMETER);
    9981000
    9991001    AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
     
    10011003    AssertPtrReturn(pfFlags, VERR_INVALID_POINTER);
    10021004    AssertPtrReturn(penmFilter, VERR_INVALID_POINTER);
     1005    AssertPtrReturn(penmReadAttrAdd, VERR_INVALID_POINTER);
     1006    AssertPtrReturn(pfReadFlags, VERR_INVALID_POINTER);
    10031007
    10041008    int rc;
     
    10111015        VbglHGCMParmUInt32Set(&Msg.filter, 0);
    10121016        VbglHGCMParmUInt32Set(&Msg.flags, 0);
     1017        VbglHGCMParmUInt32Set(&Msg.read_attr_add, 0);
     1018        VbglHGCMParmUInt32Set(&Msg.read_flags, 0);
    10131019
    10141020        rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));
     
    10181024            Msg.filter.GetUInt32((uint32_t *)penmFilter);
    10191025            Msg.flags.GetUInt32(pfFlags);
     1026            Msg.read_attr_add.GetUInt32((uint32_t *)penmReadAttrAdd);
     1027            Msg.read_flags.GetUInt32(pfReadFlags);
    10201028        }
    10211029    } while (rc == VERR_INTERRUPTED && g_fVbglR3GuestCtrlHavePeekGetCancel);
     
    10641072 * @param   puHandle            Where to return the directory handle to rewind.
    10651073 * @param   pcbDirEntry         Where to return the directory entry size.
    1066  * @param   penmAddAttrib       Where to return the additional attributes enumeration.
    1067  * @param   pfFlags             Where to return the directory reading flags..
    1068  */
    1069 VBGLR3DECL(int) VbglR3GuestCtrlDirGetRead(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle, uint32_t *pcbDirEntry,
    1070                                           uint32_t *penmAddAttrib, uint32_t *pfFlags)
     1074 */
     1075VBGLR3DECL(int) VbglR3GuestCtrlDirGetRead(PVBGLR3GUESTCTRLCMDCTX pCtx, uint32_t *puHandle, uint32_t *pcbDirEntry)
    10711076{
    10721077    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
     
    10751080    AssertPtrReturn(puHandle, VERR_INVALID_POINTER);
    10761081    AssertPtrReturn(pcbDirEntry, VERR_INVALID_POINTER);
    1077     AssertPtrReturn(penmAddAttrib, VERR_INVALID_POINTER);
    1078     AssertPtrReturn(pfFlags, VERR_INVALID_POINTER);
    10791082
    10801083    int rc;
     
    10861089        VbglHGCMParmUInt32Set(&Msg.handle, 0);
    10871090        VbglHGCMParmUInt32Set(&Msg.max_entry_size, 0);
    1088         VbglHGCMParmUInt32Set(&Msg.add_attributes, 0);
    1089         VbglHGCMParmUInt32Set(&Msg.flags, 0);
    10901091
    10911092        rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));
     
    10951096            Msg.handle.GetUInt32(puHandle);
    10961097            Msg.max_entry_size.GetUInt32(pcbDirEntry);
    1097             Msg.add_attributes.GetUInt32(penmAddAttrib);
    1098             Msg.flags.GetUInt32(pfFlags);
    10991098        }
    11001099    } while (rc == VERR_INTERRUPTED && g_fVbglR3GuestCtrlHavePeekGetCancel);
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControl.h

    r98817 r98818  
    8080    /** Context ID. */
    8181    uint32_t                        uContextID;
     82    /** Flags for reading directory entries. */
     83    uint32_t                        fRead;
     84    /** Additional attributes enumeration to use for reading directory entries. */
     85    GSTCTLFSOBJATTRADD              enmReadAttrAdd;
    8286} VBOXSERVICECTRLDIR;
    8387/** Pointer to a guest directory. */
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp

    r98817 r98818  
    10151015    AssertPtrReturn(pHostCtx, VERR_INVALID_POINTER);
    10161016
    1017     char            szPath[RTPATH_MAX];
    1018     uint32_t        fFlags;
    1019     GSTCTLDIRFILTER enmFilter;
    1020     uint32_t        uHandle = 0;
    1021     int rc = VbglR3GuestCtrlDirGetOpen(pHostCtx, szPath, sizeof(szPath), &fFlags, &enmFilter);
     1017    char               szPath[RTPATH_MAX];
     1018    uint32_t           fFlags;
     1019    GSTCTLDIRFILTER    enmFilter;
     1020    uint32_t           uHandle = 0;
     1021    uint32_t           fReadFlags;
     1022    GSTCTLFSOBJATTRADD enmAttrAdd;
     1023    int rc = VbglR3GuestCtrlDirGetOpen(pHostCtx, szPath, sizeof(szPath), &fFlags, &enmFilter, &enmAttrAdd, &fReadFlags);
    10221024    VGSvcVerbose(4, "[Dir %s]: fFlags=%#x, enmFilter=%#x, rc=%Rrc\n", szPath, fFlags, enmFilter, rc);
    10231025    if (RT_SUCCESS(rc))
     
    10311033            if (!pDir->pszPathAbs)
    10321034                rc = VERR_NO_MEMORY;
     1035
     1036            /* Save reading parameters for subsequent directory entry read calls later. */
     1037            pDir->fRead          = fReadFlags;
     1038            pDir->enmReadAttrAdd = enmAttrAdd;
    10331039
    10341040            if (RT_SUCCESS(rc))
     
    11381144    uint32_t           uHandle;
    11391145    size_t             cbDirEntry = 0;
    1140     GSTCTLFSOBJATTRADD enmAttrAdd;
    1141     uint32_t           fFlags;
    11421146    GSTCTLDIRENTRYEX   DirEntryEx;
    1143     int rc = VbglR3GuestCtrlDirGetRead(pHostCtx, &uHandle, (uint32_t *)&cbDirEntry, (uint32_t *)&enmAttrAdd, &fFlags);
     1147    int rc = VbglR3GuestCtrlDirGetRead(pHostCtx, &uHandle, (uint32_t *)&cbDirEntry);
    11441148    if (RT_SUCCESS(rc))
    11451149    {
     
    11621166            PRTDIRENTRYEX pDirEntryExRuntime = (PRTDIRENTRYEX)&DirEntryEx;
    11631167
    1164             rc = RTDirReadEx(pDir->hDir, pDirEntryExRuntime, &cbDirEntry, (RTFSOBJATTRADD)enmAttrAdd, fFlags);
     1168            rc = RTDirReadEx(pDir->hDir, pDirEntryExRuntime, &cbDirEntry, (RTFSOBJATTRADD)pDir->enmReadAttrAdd, pDir->fRead);
    11651169
    11661170            /* Paranoia. */
  • trunk/src/VBox/Main/src-client/GuestDirectoryImpl.cpp

    r98714 r98818  
    360360        HGCMSvcSetU32(&paParms[i++], mData.mOpenInfo.menmFilter);
    361361        HGCMSvcSetU32(&paParms[i++], mData.mOpenInfo.mFlags);
     362        HGCMSvcSetU32(&paParms[i++], GSTCTLFSOBJATTRADD_UNIX /* Implicit */);
     363        HGCMSvcSetU32(&paParms[i++], GSTCTL_PATH_F_ON_LINK   /* Ditto */ );
    362364
    363365        alock.release(); /* Drop lock before sending. */
     
    769771
    770772        /* Prepare HGCM call. */
    771         VBOXHGCMSVCPARM paParms[8];
     773        VBOXHGCMSVCPARM paParms[4];
    772774        int i = 0;
    773775        HGCMSvcSetU32(&paParms[i++], pEvent->ContextID());
    774776        HGCMSvcSetU32(&paParms[i++], mObjectID /* Guest directory handle */);
    775777        HGCMSvcSetU32(&paParms[i++], GSTCTL_DIRENTRY_MAX_SIZE);
    776         HGCMSvcSetU32(&paParms[i++], GSTCTLFSOBJATTRADD_UNIX /* Implicit */);
    777         HGCMSvcSetU32(&paParms[i++], GSTCTL_PATH_F_ON_LINK);
    778778
    779779        vrc = sendMessage(HOST_MSG_DIR_READ, i, paParms);
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