Changeset 2879


Ignore:
Timestamp:
Sep 5, 2016, 10:14:21 PM (9 years ago)
Author:
bird
Message:

fixes

Location:
trunk/src
Files:
3 edited

Legend:

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

    r2868 r2879  
    7171*   Global Variables                                                                                                             *
    7272*********************************************************************************************************************************/
    73 PKFSCACHE g_pFsCache = NULL;
     73/** The cache.*/
     74PKFSCACHE   g_pFsCache = NULL;
     75/** Number of times dir_cache_invalid_missing was called. */
     76static KU32 g_cInvalidates = 0;
    7477
    7578
     
    445448        else
    446449        {
    447             if (pPathObj->cchName + 1 < cbFull)
     450            if ((size_t)pPathObj->cchName + 1 < cbFull)
    448451            {
    449452                memcpy(pszFull, pPathObj->pszName, pPathObj->cchName);
     
    474477int stat_only_mtime(const char *pszPath, struct stat *pStat)
    475478{
    476     KFSLOOKUPERROR  enmError;
    477     PKFSOBJ         pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError);
    478     if (pPathObj)
    479     {
    480         if (pPathObj->bObjType != KFSOBJ_TYPE_MISSING)
    481         {
    482             kHlpAssert(pPathObj->fHaveStats); /* currently always true. */
    483             pStat->st_mtime = pPathObj->Stats.st_mtime;
     479    /* Currently a little expensive, so just hit the file system once the
     480       jobs starts comming in. */
     481    if (g_cInvalidates == 0)
     482    {
     483        KFSLOOKUPERROR  enmError;
     484        PKFSOBJ         pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError);
     485        if (pPathObj)
     486        {
     487            if (pPathObj->bObjType != KFSOBJ_TYPE_MISSING)
     488            {
     489                kHlpAssert(pPathObj->fHaveStats); /* currently always true. */
     490                pStat->st_mtime = pPathObj->Stats.st_mtime;
     491                kFsCacheObjRelease(g_pFsCache, pPathObj);
     492                return 0;
     493            }
     494
    484495            kFsCacheObjRelease(g_pFsCache, pPathObj);
    485             return 0;
    486         }
    487 
    488         kFsCacheObjRelease(g_pFsCache, pPathObj);
    489         errno = ENOENT;
    490     }
    491     else
    492         errno =    enmError == KFSLOOKUPERROR_NOT_DIR
    493                 || enmError == KFSLOOKUPERROR_PATH_COMP_NOT_DIR
    494               ? ENOTDIR : ENOENT;
    495     return -1;
     496            errno = ENOENT;
     497        }
     498        else
     499            errno =    enmError == KFSLOOKUPERROR_NOT_DIR
     500                    || enmError == KFSLOOKUPERROR_PATH_COMP_NOT_DIR
     501                  ? ENOTDIR : ENOENT;
     502        return -1;
     503    }
     504    return birdStatModTimeOnly(pszPath, &pStat->st_mtim, 1 /*fFollowLink*/);
    496505}
    497506
     
    504513void dir_cache_invalid_missing(void)
    505514{
     515    g_cInvalidates++;
    506516    kFsCacheInvalidateAll(g_pFsCache);
    507517}
  • trunk/src/kmk/kmkbuiltin/kSubmit.c

    r2877 r2879  
    791791 * @param   pWorker             The worker instance.
    792792 * @param   dwErr               The error code.
    793  */
    794 static int kSubmitWinReadFailed(PWORKERINSTANCE pWorker, DWORD dwErr)
     793 * @param   pszWhere            Where it failed.
     794 */
     795static int kSubmitWinReadFailed(PWORKERINSTANCE pWorker, DWORD dwErr, const char *pszWhere)
    795796{
    796797    DWORD dwExitCode;
    797798
    798799    if (pWorker->cbResultRead == 0)
    799         errx(1, "ReadFile failed: %u", dwErr);
     800        errx(1, "%s/ReadFile failed: %u", pszWhere, dwErr);
    800801    else
    801         errx(1, "ReadFile failed: %u (read %u bytes)", dwErr, pWorker->cbResultRead);
     802        errx(1, "%s/ReadFile failed: %u (read %u bytes)", pszWhere, dwErr, pWorker->cbResultRead);
    802803    assert(dwErr != 0);
    803804
     
    824825 * @param   pWorker             The worker instance.
    825826 */
    826 static int kSubmitReadMoreResultWin(PWORKERINSTANCE pWorker)
     827static int kSubmitReadMoreResultWin(PWORKERINSTANCE pWorker, const char *pszWhere)
    827828{
    828829    /*
     
    847848            if (dwErr == ERROR_IO_PENDING)
    848849                return -1;
    849             return kSubmitWinReadFailed(pWorker, dwErr);
     850            return kSubmitWinReadFailed(pWorker, dwErr, pszWhere);
    850851        }
    851852
     
    886887     */
    887888l_again:
    888     rc = kSubmitReadMoreResultWin(pWorker);
     889    rc = kSubmitReadMoreResultWin(pWorker, "kSubmitMarkActive");
    889890    if (rc == -1)
    890891    {
     
    952953        while (pWorker->cbResultRead < sizeof(pWorker->Result))
    953954        {
    954             int rc = kSubmitReadMoreResultWin(pWorker);
     955            int rc = kSubmitReadMoreResultWin(pWorker, "kSubmitSubProcGetResult/more");
    955956            if (rc == -1)
    956957                return -1;
     
    962963    {
    963964        DWORD dwErr = GetLastError();
    964         kSubmitWinReadFailed(pWorker, dwErr);
     965        kSubmitWinReadFailed(pWorker, dwErr, "kSubmitSubProcGetResult/result");
    965966    }
    966967
  • trunk/src/lib/nt/kFsCache.c

    r2872 r2879  
    414414        pHashEntry->fAbsolute       = fAbsolute;
    415415        pHashEntry->idxMissingGen   = (KU8)idxMissingGen;
    416         pHashEntry->pFsObj          = pFsObj;
    417416        pHashEntry->enmError        = enmError;
    418417        pHashEntry->pszPath         = (const char *)kHlpMemCopy(pHashEntry + 1, pszPath, cchPath + 1);
    419418        if (pFsObj)
    420             pHashEntry->uCacheGen = pFsObj->bObjType != KFSOBJ_TYPE_MISSING
    421                                   ? pCache->auGenerations[       pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN]
    422                                   : pCache->auGenerationsMissing[pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN];
    423         else if (enmError != KFSLOOKUPERROR_UNSUPPORTED)
    424             pHashEntry->uCacheGen = pCache->auGenerationsMissing[idxMissingGen];
     419        {
     420            pHashEntry->pFsObj      = kFsCacheObjRetainInternal(pFsObj);
     421            pHashEntry->uCacheGen   = pFsObj->bObjType != KFSOBJ_TYPE_MISSING
     422                                    ? pCache->auGenerations[       pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN]
     423                                    : pCache->auGenerationsMissing[pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN];
     424            pFsObj->abUnused[0] += 1; // for debugging
     425        }
    425426        else
    426             pHashEntry->uCacheGen = KFSOBJ_CACHE_GEN_IGNORE;
     427        {
     428            pHashEntry->pFsObj      = NULL;
     429            if (enmError != KFSLOOKUPERROR_UNSUPPORTED)
     430                pHashEntry->uCacheGen = pCache->auGenerationsMissing[idxMissingGen];
     431            else
     432                pHashEntry->uCacheGen = KFSOBJ_CACHE_GEN_IGNORE;
     433        }
    427434
    428435        pHashEntry->pNext = pCache->apAnsiPaths[idxHashTab];
     
    464471        pHashEntry->fAbsolute       = fAbsolute;
    465472        pHashEntry->idxMissingGen   = (KU8)idxMissingGen;
    466         pHashEntry->pFsObj          = pFsObj;
    467473        pHashEntry->enmError        = enmError;
    468474        pHashEntry->pwszPath        = (const wchar_t *)kHlpMemCopy(pHashEntry + 1, pwszPath, (cwcPath + 1) * sizeof(wchar_t));
    469475        if (pFsObj)
    470             pHashEntry->uCacheGen = pFsObj->bObjType != KFSOBJ_TYPE_MISSING
    471                                   ? pCache->auGenerations[       pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN]
    472                                   : pCache->auGenerationsMissing[pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN];
    473         else if (enmError != KFSLOOKUPERROR_UNSUPPORTED)
    474             pHashEntry->uCacheGen = pCache->auGenerationsMissing[idxMissingGen];
     476        {
     477            pHashEntry->pFsObj      = kFsCacheObjRetainInternal(pFsObj);
     478            pHashEntry->uCacheGen   = pFsObj->bObjType != KFSOBJ_TYPE_MISSING
     479                                    ? pCache->auGenerations[       pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN]
     480                                    : pCache->auGenerationsMissing[pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN];
     481            pFsObj->abUnused[0] += 1; // for debugging
     482        }
    475483        else
    476             pHashEntry->uCacheGen = KFSOBJ_CACHE_GEN_IGNORE;
     484        {
     485            pHashEntry->pFsObj      = NULL;
     486            if (enmError != KFSLOOKUPERROR_UNSUPPORTED)
     487                pHashEntry->uCacheGen = pCache->auGenerationsMissing[idxMissingGen];
     488            else
     489                pHashEntry->uCacheGen = KFSOBJ_CACHE_GEN_IGNORE;
     490        }
    477491
    478492        pHashEntry->pNext = pCache->apUtf16Paths[idxHashTab];
     
    33643378
    33653379    KFSCACHE_LOG(("Destroying %s/%s, type=%d\n", pObj->pParent ? pObj->pParent->Obj.pszName : "", pObj->pszName, pObj->bObjType));
     3380    if (pObj->abUnused[1] != 0)
     3381    {
     3382        fprintf(stderr, "Destroying %s/%s, type=%d, path hash entries: %d!\n", pObj->pParent ? pObj->pParent->Obj.pszName : "",
     3383                pObj->pszName, pObj->bObjType, pObj->abUnused[0]);
     3384        __debugbreak();
     3385    }
    33663386
    33673387    /*
Note: See TracChangeset for help on using the changeset viewer.