VirtualBox

Changeset 77047 in vbox


Ignore:
Timestamp:
Jan 30, 2019 3:38:53 PM (6 years ago)
Author:
vboxsync
Message:

iprt/isomaker: Optimized native handle (file descriptor) usage when adding real directories.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/mangling.h

    r76585 r77047  
    809809# define RTVfsDirFromRTDir                              RT_MANGLER(RTVfsDirFromRTDir)
    810810# define RTVfsDirOpenNormal                             RT_MANGLER(RTVfsDirOpenNormal)
     811# define RTVfsDirIsStdDir                               RT_MANGLER(RTVfsDirIsStdDir)
    811812# define RTDvmCreate                                    RT_MANGLER(RTDvmCreate)
    812813# define RTDvmCreateFromVfsFile                         RT_MANGLER(RTDvmCreateFromVfsFile)
     
    25752576# define RTVfsDirRemoveDir                              RT_MANGLER(RTVfsDirRemoveDir)
    25762577# define RTVfsDirSetPathMode                            RT_MANGLER(RTVfsDirSetPathMode)
     2578# define RTVfsDirToPrivate                              RT_MANGLER(RTVfsDirToPrivate)
    25772579# define RTVfsFileFlush                                 RT_MANGLER(RTVfsFileFlush)
    25782580# define RTVfsFileFromBuffer                            RT_MANGLER(RTVfsFileFromBuffer)
  • trunk/include/iprt/vfs.h

    r76585 r77047  
    686686RTDECL(int) RTVfsDirOpenNormal(const char *pszPath, uint32_t fFlags, PRTVFSDIR phVfsDir);
    687687
     688/** Checks if @a hVfsDir was opened using RTVfsDirOpenNormal() or
     689 *  RTVfsDirFromRTDir(), either directly or indirectly. */
     690RTDECL(bool) RTVfsDirIsStdDir(RTVFSDIR hVfsDir);
     691
    688692/**
    689693 * Queries information about a object in or under the given directory.
  • trunk/include/iprt/vfslowlevel.h

    r76585 r77047  
    761761#define RTVFSDIR_F_NO_VFS_REF   RT_BIT_32(0)
    762762/** @} */
     763
     764/**
     765 * Gets the private data of a directory.
     766 *
     767 * @returns Pointer to the private data.  NULL if the handle is invalid in some
     768 *          way.
     769 * @param   hVfsDir             The directory handle.
     770 * @param   pDirOps             The directory operations.  This servers as a
     771 *                              sort of password.
     772 */
     773RTDECL(void *) RTVfsDirToPrivate(RTVFSDIR hVfsDir, PCRTVFSDIROPS pDirOps);
    763774
    764775
  • trunk/src/VBox/Runtime/common/fs/isomakercmd.cpp

    r76553 r77047  
    17041704 * @param   cDepth              Number of recursions.  Used to deal with loopy
    17051705 *                              directories.
     1706 * @param   fFilesWithSrcPath   Whether to add files using @a pszSrc or to add
     1707 *                              as VFS handles (open first). For saving native
     1708 *                              file descriptors.
    17061709 */
    17071710static int rtFsIsoMakerCmdAddVfsDirRecursive(PRTFSISOMAKERCMDOPTS pOpts, RTVFSDIR hVfsDir, uint32_t idxDirObj,
    1708                                              char *pszSrc, size_t cchSrc, uint32_t fNamespaces, uint8_t cDepth)
     1711                                             char *pszSrc, size_t cchSrc, uint32_t fNamespaces, uint8_t cDepth,
     1712                                             bool fFilesWithSrcPath)
    17091713{
    17101714    /*
     
    17751779                {
    17761780                    /*
    1777                      * Files are added with VFS file sources.
    1778                      * The ASSUMPTION is that we're working with a virtual file system
    1779                      * here and won't be wasting native file descriptors.
     1781                     * Files are either added with VFS handles or paths to the sources,
     1782                     * depending on what's considered more efficient.  We prefer the latter
     1783                     * if hVfsDir maps to native handle and not a virtual one.
    17801784                     */
    1781                     RTVFSFILE hVfsFileSrc;
    1782                     rc = RTVfsDirOpenFile(hVfsDir, pDirEntry->szName,
    1783                                           RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE, &hVfsFileSrc);
     1785                    if (!fFilesWithSrcPath)
     1786                    {
     1787                        RTVFSFILE hVfsFileSrc;
     1788                        rc = RTVfsDirOpenFile(hVfsDir, pDirEntry->szName,
     1789                                              RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE, &hVfsFileSrc);
     1790                        if (RT_SUCCESS(rc))
     1791                        {
     1792                            rc = RTFsIsoMakerAddUnnamedFileWithVfsFile(pOpts->hIsoMaker, hVfsFileSrc, &idxObj);
     1793                            RTVfsFileRelease(hVfsFileSrc);
     1794                            if (RT_FAILURE(rc))
     1795                                rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error adding file '%s' (VFS recursive, handle): %Rrc",
     1796                                                            pszSrc, rc);
     1797                        }
     1798                        else
     1799                            rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error opening file '%s' (VFS recursive): %Rrc", pszSrc, rc);
     1800                    }
     1801                    else
     1802                    {
     1803                        /* Add file with source path: */
     1804                        rc = RTFsIsoMakerAddUnnamedFileWithSrcPath(pOpts->hIsoMaker, pszSrc, &idxObj);
     1805                        if (RT_FAILURE(rc))
     1806                            rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error adding file '%s' (VFS recursive, path): %Rrc",
     1807                                                        pszSrc, rc);
     1808                    }
    17841809                    if (RT_SUCCESS(rc))
    17851810                    {
    1786                         rc = RTFsIsoMakerAddUnnamedFileWithVfsFile(pOpts->hIsoMaker, hVfsFileSrc, &idxObj);
    1787                         RTVfsFileRelease(hVfsFileSrc);
    1788                         if (RT_SUCCESS(rc))
    1789                         {
    1790                             pOpts->cItemsAdded++;
    1791                             rc = RTFsIsoMakerObjSetNameAndParent(pOpts->hIsoMaker, idxObj, idxDirObj, fNamespaces,
    1792                                                                  pDirEntry->szName);
    1793                             if (RT_FAILURE(rc))
    1794                                 rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error setting parent & name on file '%s' to '%s': %Rrc",
    1795                                                             pszSrc, pDirEntry->szName, rc);
    1796                         }
    1797                         else
    1798                             rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error adding file '%s' (VFS recursive): %Rrc", pszSrc, rc);
     1811                        pOpts->cItemsAdded++;
     1812                        rc = RTFsIsoMakerObjSetNameAndParent(pOpts->hIsoMaker, idxObj, idxDirObj, fNamespaces,
     1813                                                             pDirEntry->szName);
     1814                        if (RT_FAILURE(rc))
     1815                            rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error setting parent & name on file '%s' to '%s': %Rrc",
     1816                                                        pszSrc, pDirEntry->szName, rc);
    17991817                    }
    1800                     else
    1801                         rc = rtFsIsoMakerCmdErrorRc(pOpts, rc, "Error opening file '%s' (VFS recursive): %Rrc", pszSrc, rc);
    18021818                }
    18031819                else if (RTFS_IS_DIRECTORY(pDirEntry->Info.Attr.fMode))
     
    18191835                                /* Recurse into the sub-directory. */
    18201836                                rc = rtFsIsoMakerCmdAddVfsDirRecursive(pOpts, hVfsSubDirSrc, idxObj, pszSrc,
    1821                                                                        cchSrc + 1 + pDirEntry->cbName, fNamespaces, cDepth + 1);
     1837                                                                       cchSrc + 1 + pDirEntry->cbName, fNamespaces, cDepth + 1,
     1838                                                                       fFilesWithSrcPath);
    18221839                            else
    18231840                                rc = rtFsIsoMakerCmdErrorRc(pOpts, rc,
     
    18641881 * @param   pszSrc              The source directory name.
    18651882 * @param   pParsed             The parsed names.
     1883 * @param   fFilesWithSrcPath   Whether to add files using @a pszSrc
     1884 *                              or to add as VFS handles (open first).  For
     1885 *                              saving native file descriptors.
    18661886 * @param   pidxObj             Where to return the configuration index for the
    18671887 *                              added file.  Optional.
    18681888 */
    18691889static int rtFsIsoMakerCmdAddVfsDirCommon(PRTFSISOMAKERCMDOPTS pOpts, RTVFSDIR hVfsDirSrc, char *pszSrc,
    1870                                           PCRTFSISOMKCMDPARSEDNAMES pParsed, PCRTFSOBJINFO pObjInfo)
     1890                                          PCRTFSISOMKCMDPARSEDNAMES pParsed, bool fFilesWithSrcPath, PCRTFSOBJINFO pObjInfo)
    18711891{
    18721892    /*
     
    19041924            fNamespaces |= pParsed->aNames[i].fNameSpecifiers & RTFSISOMAKERCMDNAME_MAJOR_MASK;
    19051925        rc = rtFsIsoMakerCmdAddVfsDirRecursive(pOpts, hVfsDirSrc, idxObj, pszSrc,
    1906                                                pParsed->aNames[pParsed->cNamesWithSrc - 1].cchPath, fNamespaces, 0 /*cDepth*/);
     1926                                               pParsed->aNames[pParsed->cNamesWithSrc - 1].cchPath, fNamespaces, 0 /*cDepth*/,
     1927                                               fFilesWithSrcPath);
    19071928    }
    19081929
     
    19291950    if (RT_SUCCESS(rc))
    19301951    {
    1931         rc = rtFsIsoMakerCmdAddVfsDirCommon(pOpts, hVfsDirSrc, pszSrc, pParsed, pObjInfo);
     1952        rc = rtFsIsoMakerCmdAddVfsDirCommon(pOpts, hVfsDirSrc, pszSrc, pParsed, false /*fFilesWithSrcPath*/, pObjInfo);
    19321953        RTVfsDirRelease(hVfsDirSrc);
    19331954    }
     
    19581979    if (RT_SUCCESS(rc))
    19591980    {
    1960         rc = rtFsIsoMakerCmdAddVfsDirCommon(pOpts, hVfsDirSrc, pszSrc, pParsed, pObjInfo);
     1981        rc = rtFsIsoMakerCmdAddVfsDirCommon(pOpts, hVfsDirSrc, pszSrc, pParsed,
     1982                                            RTVfsDirIsStdDir(hVfsDirSrc) /*fFilesWithSrcPath*/, pObjInfo);
    19611983        RTVfsDirRelease(hVfsDirSrc);
    19621984    }
  • trunk/src/VBox/Runtime/common/vfs/vfsbase.cpp

    r76553 r77047  
    25192519
    25202520
     2521RTDECL(void *) RTVfsDirToPrivate(RTVFSDIR hVfsDir, PCRTVFSDIROPS pDirOps)
     2522{
     2523    RTVFSDIRINTERNAL *pThis = hVfsDir;
     2524    AssertPtrReturn(pThis, NULL);
     2525    AssertReturn(pThis->uMagic == RTVFSDIR_MAGIC, NULL);
     2526    if (pThis->pOps != pDirOps)
     2527        return NULL;
     2528    return pThis->Base.pvThis;
     2529}
     2530
     2531
    25212532#ifdef DEBUG
    25222533# undef RTVfsDirRetain
  • trunk/src/VBox/Runtime/common/vfs/vfsstddir.cpp

    r76553 r77047  
    753753
    754754
     755RTDECL(bool) RTVfsDirIsStdDir(RTVFSDIR hVfsDir)
     756{
     757    return RTVfsDirToPrivate(hVfsDir, &g_rtVfsStdDirOps) != NULL;
     758}
     759
     760
    755761/**
    756762 * @interface_method_impl{RTVFSCHAINELEMENTREG,pfnValidate}
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