Ignore:
Timestamp:
Jun 8, 2020, 9:28:44 PM (5 years ago)
Author:
bird
Message:

kFsCache: Don't need to lock the whole cache when using kFsCacheObjAddUserData and kFsCacheObjGetUserData. Fixed incorrect debug hack checking that we don't release objects while they are in the path hash structures.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/nt/kFsCache.c

    r3359 r3362  
    429429                                    ? pCache->auGenerations[       pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN]
    430430                                    : pCache->auGenerationsMissing[pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN];
    431             pFsObj->abUnused[0] += 1; // for debugging
     431            pFsObj->cPathHashRefs += 1; // for debugging
    432432        }
    433433        else
     
    486486                                    ? pCache->auGenerations[       pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN]
    487487                                    : pCache->auGenerationsMissing[pFsObj->fFlags & KFSOBJ_F_USE_CUSTOM_GEN];
    488             pFsObj->abUnused[0] += 1; // for debugging
     488            pFsObj->cPathHashRefs += 1; // for debugging
    489489        }
    490490        else
     
    593593        pObj->bObjType      = bObjType;
    594594        pObj->fHaveStats    = K_FALSE;
    595         pObj->abUnused[0]   = K_FALSE;
    596         pObj->abUnused[1]   = K_FALSE;
     595        pObj->cPathHashRefs = 0;
     596        pObj->idxUserDataLock = KU8_MAX;
    597597        pObj->fFlags        = pParent->Obj.fFlags & KFSOBJ_F_INHERITED_MASK;
    598598        pObj->pParent       = pParent;
     
    33863386            else
    33873387            {
     3388                pHashEntry->pFsObj->cPathHashRefs -= 1;
    33883389                kFsCacheObjRelease(pCache, pHashEntry->pFsObj);
    33893390                if (pHashEntry->fAbsolute)
     
    34473448            else
    34483449            {
     3450                pHashEntry->pFsObj->cPathHashRefs -= 1;
    34493451                kFsCacheObjRelease(pCache, pHashEntry->pFsObj);
    34503452                if (pHashEntry->fAbsolute)
     
    39003902    KFSCACHE_LOG(("Destroying %s/%s, type=%d, pObj=%p, pszWhere=%s\n",
    39013903                  pObj->pParent ? pObj->pParent->Obj.pszName : "", pObj->pszName, pObj->bObjType, pObj, pszWhere));
    3902     if (pObj->abUnused[1] != 0)
     3904    if (pObj->cPathHashRefs != 0)
    39033905    {
    39043906        fprintf(stderr, "Destroying %s/%s, type=%d, path hash entries: %d!\n", pObj->pParent ? pObj->pParent->Obj.pszName : "",
    3905                 pObj->pszName, pObj->bObjType, pObj->abUnused[0]);
     3907                pObj->pszName, pObj->bObjType, pObj->cPathHashRefs);
    39063908        fflush(stderr);
    39073909        __debugbreak();
     
    40804082{
    40814083    kHlpAssert(cbUserData >= sizeof(*pNew));
    4082     KFSCACHE_LOCK(pCache);
     4084    KFSCACHE_OBJUSERDATA_LOCK(pCache, pObj);
    40834085
    40844086    if (kFsCacheObjGetUserData(pCache, pObj, uKey) == NULL)
     
    40914093            pNew->pNext         = pObj->pUserDataHead;
    40924094            pObj->pUserDataHead = pNew;
    4093             KFSCACHE_UNLOCK(pCache);
     4095            KFSCACHE_OBJUSERDATA_UNLOCK(pCache, pObj);
    40944096            return pNew;
    40954097        }
    40964098    }
    40974099
    4098     KFSCACHE_UNLOCK(pCache);
     4100    KFSCACHE_OBJUSERDATA_UNLOCK(pCache, pObj);
    40994101    return NULL;
    41004102}
     
    41154117    kHlpAssert(pCache->u32Magic == KFSCACHE_MAGIC);
    41164118    kHlpAssert(pObj->u32Magic == KFSOBJ_MAGIC);
    4117     KFSCACHE_LOCK(pCache);
     4119    KFSCACHE_OBJUSERDATA_LOCK(pCache, pObj);
    41184120
    41194121    for (pCur = pObj->pUserDataHead; pCur; pCur = pCur->pNext)
    41204122        if (pCur->uKey == uKey)
    41214123        {
    4122             KFSCACHE_UNLOCK(pCache);
     4124            KFSCACHE_OBJUSERDATA_UNLOCK(pCache, pObj);
    41234125            return pCur;
    41244126        }
    41254127
    4126     KFSCACHE_UNLOCK(pCache);
     4128    KFSCACHE_OBJUSERDATA_UNLOCK(pCache, pObj);
    41274129    return NULL;
    41284130}
    41294131
     4132
     4133/**
     4134 * Determins the idxUserDataLock value.
     4135 *
     4136 * Called by KFSCACHE_OBJUSERDATA_LOCK when idxUserDataLock is set to KU8_MAX.
     4137 *
     4138 * @returns The proper idxUserDataLock value.
     4139 * @param   pCache              The cache.
     4140 * @param   pObj                The object.
     4141 */
     4142KU8 kFsCacheObjGetUserDataLockIndex(PKFSCACHE pCache, PKFSOBJ pObj)
     4143{
     4144    KU8 idxUserDataLock = pObj->idxUserDataLock;
     4145    if (idxUserDataLock == KU8_MAX)
     4146    {
     4147        KFSCACHE_LOCK(pCache);
     4148        idxUserDataLock = pObj->idxUserDataLock;
     4149        if (idxUserDataLock == KU8_MAX)
     4150        {
     4151            idxUserDataLock = pCache->idxUserDataNext++;
     4152            idxUserDataLock %= K_ELEMENTS(pCache->auUserDataLocks);
     4153            pObj->idxUserDataLock = idxUserDataLock;
     4154        }
     4155        KFSCACHE_UNLOCK(pCache);
     4156    }
     4157    return idxUserDataLock;
     4158}
    41304159
    41314160/**
     
    47664795
    47674796#ifdef KFSCACHE_CFG_LOCKING
    4768             InitializeCriticalSection(&pCache->u.CritSect);
     4797            {
     4798                KSIZE idx = K_ELEMENTS(pCache->auUserDataLocks);
     4799                while (idx-- > 0)
     4800                    InitializeCriticalSection(&pCache->auUserDataLocks[idx].CritSect);
     4801                InitializeCriticalSection(&pCache->u.CritSect);
     4802            }
    47694803#endif
    47704804            return pCache;
Note: See TracChangeset for help on using the changeset viewer.