Changeset 2855 in kBuild
- Timestamp:
- Aug 31, 2016 9:21:22 PM (9 years ago)
- Location:
- trunk/src/lib/nt
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/nt/kFsCache.c
r2854 r2855 695 695 #endif 696 696 ; 697 PKFSOBJ pObj = (PKFSOBJ)kHlpAlloc(cbObj); 697 PKFSOBJ pObj; 698 kHlpAssert(pCache->u32Magic == KFSCACHE_MAGIC); 699 700 pObj = (PKFSOBJ)kHlpAlloc(cbObj); 698 701 if (pObj) 699 702 { … … 715 718 pObj->fFlags = pParent->Obj.fFlags; 716 719 pObj->pParent = pParent; 720 pObj->pUserDataHead = NULL; 717 721 718 722 #ifdef KFSCACHE_CFG_UTF16 … … 2131 2135 KU32 idxHashTab = uHashPath % K_ELEMENTS(pCache->apAnsiPaths); 2132 2136 PKFSHASHA pHashEntry = pCache->apAnsiPaths[idxHashTab]; 2137 kHlpAssert(pCache->u32Magic == KFSCACHE_MAGIC); 2133 2138 if (pHashEntry) 2134 2139 { … … 2220 2225 KU32 idxHashTab = uHashPath % K_ELEMENTS(pCache->apAnsiPaths); 2221 2226 PKFSHASHW pHashEntry = pCache->apUtf16Paths[idxHashTab]; 2227 kHlpAssert(pCache->u32Magic == KFSCACHE_MAGIC); 2222 2228 if (pHashEntry) 2223 2229 { … … 2293 2299 kHlpAssert(pObj->cRefs == 0); 2294 2300 kHlpAssert(pObj->pParent == NULL); 2295 2301 kHlpAssert(pObj->u32Magic == KFSOBJ_MAGIC); 2302 2303 /* 2304 * Invalidate the structure. 2305 */ 2306 pObj->u32Magic = ~KFSOBJ_MAGIC; 2307 2308 /* 2309 * Destroy any user data first. 2310 */ 2311 while (pObj->pUserDataHead != NULL) 2312 { 2313 PKFSUSERDATA pUserData = pObj->pUserDataHead; 2314 pObj->pUserDataHead = pUserData->pNext; 2315 pUserData->pfnDestructor(pCache, pObj, pUserData); 2316 kHlpFree(pUserData); 2317 } 2318 2319 /* 2320 * Do type specific destruction 2321 */ 2296 2322 switch (pObj->bObjType) 2297 2323 { 2298 2324 case KFSOBJ_TYPE_MISSING: 2299 //case KFSOBJ_TYPE_MISSING | KFSOBJ_TYPE_F_INVALID:2300 2325 /* nothing else to do here */ 2326 pCache->cbObjects -= sizeof(KFSDIR); 2327 break; 2328 2329 case KFSOBJ_TYPE_DIR: 2330 { 2331 PKFSDIR pDir = (PKFSDIR)pObj; 2332 KU32 cChildren = pDir->cChildren; 2333 pCache->cbObjects -= sizeof(*pDir) 2334 + K_ALIGN_Z(cChildren, 16) * sizeof(pDir->papChildren) 2335 + pDir->cHashTab * sizeof(pDir->paHashTab); 2336 2337 pDir->cChildren = 0; 2338 while (cChildren-- > 0) 2339 kFsCacheObjRelease(pCache, pDir->papChildren[cChildren]); 2340 kHlpFree(pDir->papChildren); 2341 pDir->papChildren = NULL; 2342 2343 kHlpFree(pDir->paHashTab); 2344 pDir->paHashTab = NULL; 2345 break; 2346 } 2347 2348 case KFSOBJ_TYPE_FILE: 2349 case KFSOBJ_TYPE_OTHER: 2301 2350 pCache->cbObjects -= sizeof(*pObj); 2302 2351 break; 2303 2352 2304 case KFSOBJ_TYPE_DIR:2305 //case KFSOBJ_TYPE_DIR | KFSOBJ_TYPE_F_INVALID:2306 case KFSOBJ_TYPE_FILE:2307 //case KFSOBJ_TYPE_FILE | KFSOBJ_TYPE_F_INVALID:2308 kHlpAssertFailed();2309 break;2310 2353 default: 2311 kHlpAssertFailed(); 2312 } 2354 return 0; 2355 } 2356 2357 /* 2358 * Common bits. 2359 */ 2360 pCache->cbObjects -= pObj->cchName + 1; 2361 #ifdef KFSCACHE_CFG_UTF16 2362 pCache->cbObjects -= (pObj->cwcName + 1) * sizeof(wchar_t); 2363 #endif 2364 #ifdef KFSCACHE_CFG_SHORT_NAMES 2365 if (pObj->pszName != pObj->pszShortName) 2366 { 2367 pCache->cbObjects -= pObj->cchShortName + 1; 2368 # ifdef KFSCACHE_CFG_UTF16 2369 pCache->cbObjects -= (pObj->cwcShortName + 1) * sizeof(wchar_t); 2370 # endif 2371 } 2372 #endif 2313 2373 pCache->cObjects--; 2314 free(pObj); 2374 2375 kHlpFree(pObj); 2315 2376 return 0; 2316 2377 } … … 2326 2387 KU32 kFsCacheObjRelease(PKFSCACHE pCache, PKFSOBJ pObj) 2327 2388 { 2328 KU32 cRefs = --pObj->cRefs; 2389 KU32 cRefs; 2390 kHlpAssert(pCache->u32Magic == KFSCACHE_MAGIC); 2391 kHlpAssert(pObj->u32Magic == KFSOBJ_MAGIC); 2392 2393 cRefs = --pObj->cRefs; 2329 2394 if (cRefs) 2330 2395 return cRefs; … … 2341 2406 KU32 kFsCacheObjRetain(PKFSOBJ pObj) 2342 2407 { 2343 KU32 cRefs = ++pObj->cRefs; 2408 KU32 cRefs; 2409 kHlpAssert(pCache->u32Magic == KFSCACHE_MAGIC); 2410 kHlpAssert(pObj->u32Magic == KFSOBJ_MAGIC); 2411 2412 cRefs = ++pObj->cRefs; 2344 2413 kHlpAssert(cRefs < 16384); 2345 2414 return cRefs; -
trunk/src/lib/nt/kFsCache.h
r2853 r2855 95 95 96 96 97 /** Pointer to a cache. */ 98 typedef struct KFSCACHE *PKFSCACHE; 97 99 /** Pointer to a core object. */ 98 100 typedef struct KFSOBJ *PKFSOBJ; … … 116 118 PKFSOBJ pObj; 117 119 } KFSOBJHASH; 120 121 122 /** Pointer to a user data item. */ 123 typedef struct KFSUSERDATA *PKFSUSERDATA; 124 /** 125 * User data item associated with a cache node. 126 */ 127 typedef struct KFSUSERDATA 128 { 129 /** Pointer to the next piece of user data. */ 130 PKFSUSERDATA pNext; 131 /** The key identifying this user. */ 132 KUPTR uKey; 133 /** The destructor. */ 134 void (*pfnDestructor)(PKFSCACHE pCache, PKFSOBJ pObj, PKFSUSERDATA pData); 135 } KFSUSERDATA; 118 136 119 137 … … 180 198 #endif 181 199 200 /** Pointer to the first user data item */ 201 PKFSUSERDATA pUserDataHead; 202 182 203 /** Stats - only valid when fHaveStats is set. */ 183 204 BirdStat_T Stats; … … 317 338 318 339 319 /** Pointer to a cache. */320 typedef struct KFSCACHE *PKFSCACHE;321 340 /** 322 341 * Directory cache instance.
Note:
See TracChangeset
for help on using the changeset viewer.