Ignore:
Timestamp:
Mar 21, 2018, 12:27:47 PM (7 years ago)
Author:
bird
Message:

kmk/win: Run kDepObj on worker thread.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/dir-nt-bird.c

    r3167 r3169  
    483483void nt_fullpath_cached(const char *pszPath, char *pszFull, size_t cbFull)
    484484{
    485     KFSLOOKUPERROR  enmError;
    486     PKFSOBJ         pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError);
    487     assert(GetCurrentThreadId() == g_idMainThread);
    488     if (pPathObj)
    489     {
    490         KSIZE off = pPathObj->cchParent;
    491         if (off > 0)
    492         {
    493             KSIZE offEnd = off + pPathObj->cchName;
    494             if (offEnd < cbFull)
    495             {
    496                 PKFSDIR pAncestor;
    497 
    498                 pszFull[offEnd] = '\0';
    499                 memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName);
    500 
    501                 for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent)
     485    if (GetCurrentThreadId() == g_idMainThread)
     486    {
     487        KFSLOOKUPERROR  enmError;
     488        PKFSOBJ         pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError);
     489        if (pPathObj)
     490        {
     491            KSIZE off = pPathObj->cchParent;
     492            if (off > 0)
     493            {
     494                KSIZE offEnd = off + pPathObj->cchName;
     495                if (offEnd < cbFull)
    502496                {
    503                     kHlpAssert(off > 1);
    504                     kHlpAssert(pAncestor != NULL);
    505                     kHlpAssert(pAncestor->Obj.cchName > 0);
    506                     pszFull[--off] = '/';
     497                    PKFSDIR pAncestor;
     498
     499                    pszFull[offEnd] = '\0';
     500                    memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName);
     501
     502                    for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent)
     503                    {
     504                        kHlpAssert(off > 1);
     505                        kHlpAssert(pAncestor != NULL);
     506                        kHlpAssert(pAncestor->Obj.cchName > 0);
     507                        pszFull[--off] = '/';
    507508#ifdef KFSCACHE_CFG_SHORT_NAMES
    508                     if (   pAncestor->Obj.pszName == pAncestor->Obj.pszShortName
    509                         || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)
     509                        if (   pAncestor->Obj.pszName == pAncestor->Obj.pszShortName
     510                            || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)
    510511#endif
    511                     {
    512                         off -= pAncestor->Obj.cchName;
    513                         kHlpAssert(pAncestor->Obj.cchParent == off);
    514                         memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
     512                        {
     513                            off -= pAncestor->Obj.cchName;
     514                            kHlpAssert(pAncestor->Obj.cchParent == off);
     515                            memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName);
     516                        }
     517#ifdef KFSCACHE_CFG_SHORT_NAMES
     518                        else
     519                        {
     520                            /*
     521                             * The long name constains a space, so use the alternative name instead.
     522                             * Most likely the alternative name differs in length, usually it's shorter,
     523                             * so we have to shift the part of the path we've already assembled
     524                             * accordingly.
     525                             */
     526                            KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName;
     527                            if (cchDelta != 0)
     528                            {
     529                                if ((KSIZE)(offEnd + cchDelta) >= cbFull)
     530                                    goto l_fallback;
     531                                memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off);
     532                                off    += cchDelta;
     533                                offEnd += cchDelta;
     534                            }
     535                            off -= pAncestor->Obj.cchShortName;
     536                            kHlpAssert(pAncestor->Obj.cchParent == off);
     537                            memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName);
     538                        }
     539#endif
    515540                    }
    516 #ifdef KFSCACHE_CFG_SHORT_NAMES
    517                     else
    518                     {
    519                         /*
    520                          * The long name constains a space, so use the alternative name instead.
    521                          * Most likely the alternative name differs in length, usually it's shorter,
    522                          * so we have to shift the part of the path we've already assembled
    523                          * accordingly.
    524                          */
    525                         KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName;
    526                         if (cchDelta != 0)
    527                         {
    528                             if ((KSIZE)(offEnd + cchDelta) >= cbFull)
    529                                 goto l_fallback;
    530                             memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off);
    531                             off    += cchDelta;
    532                             offEnd += cchDelta;
    533                         }
    534                         off -= pAncestor->Obj.cchShortName;
    535                         kHlpAssert(pAncestor->Obj.cchParent == off);
    536                         memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName);
    537                     }
    538 #endif
     541                    kFsCacheObjRelease(g_pFsCache, pPathObj);
     542                    return;
    539543                }
    540                 kFsCacheObjRelease(g_pFsCache, pPathObj);
    541                 return;
    542             }
    543         }
    544         else
    545         {
    546             if ((size_t)pPathObj->cchName + 1 < cbFull)
    547             {
    548                 /* Assume no spaces here. */
    549                 memcpy(pszFull, pPathObj->pszName, pPathObj->cchName);
    550                 pszFull[pPathObj->cchName] = '/';
    551                 pszFull[pPathObj->cchName + 1] = '\0';
    552 
    553                 kFsCacheObjRelease(g_pFsCache, pPathObj);
    554                 return;
    555             }
    556         }
    557 
    558         /* do fallback. */
     544            }
     545            else
     546            {
     547                if ((size_t)pPathObj->cchName + 1 < cbFull)
     548                {
     549                    /* Assume no spaces here. */
     550                    memcpy(pszFull, pPathObj->pszName, pPathObj->cchName);
     551                    pszFull[pPathObj->cchName] = '/';
     552                    pszFull[pPathObj->cchName + 1] = '\0';
     553
     554                    kFsCacheObjRelease(g_pFsCache, pPathObj);
     555                    return;
     556                }
     557            }
     558
     559            /* do fallback. */
    559560#ifdef KFSCACHE_CFG_SHORT_NAMES
    560561l_fallback:
    561562#endif
    562         kHlpAssertFailed();
    563         kFsCacheObjRelease(g_pFsCache, pPathObj);
     563            kHlpAssertFailed();
     564            kFsCacheObjRelease(g_pFsCache, pPathObj);
     565        }
    564566    }
    565567
Note: See TracChangeset for help on using the changeset viewer.