Lines Matching +full:file +full:- +full:entry +full:- +full:cache
1 /* Copyright 1998,2001-2003,2007-2009 Alain Knaff.
2 * This file is part of mtools.
30 return (arg << shift) | (arg >> (32 - shift)); in rol()
67 int entry; in addBit() local
70 entry = (hash / BITS_PER_INT) % DC_BITMAP_SIZE; in addBit()
73 return bitmap[entry] & bit; in addBit()
75 bitmap[entry] |= bit; in addBit()
80 static int _addHash(dirCache_t *cache, unsigned int hash, int checkOnly) in _addHash() argument
83 addBit(cache->bm0, hash, checkOnly) && in _addHash()
84 addBit(cache->bm1, rol(hash,12), checkOnly) && in _addHash()
85 addBit(cache->bm2, rol(hash,24), checkOnly); in _addHash()
89 static void addNameToHash(dirCache_t *cache, wchar_t *name) in addNameToHash() argument
91 _addHash(cache, calcHash(name), 0); in addNameToHash()
94 static void hashDce(dirCache_t *cache, dirCacheEntry_t *dce) in hashDce() argument
96 if(dce->beginSlot != cache->nrHashed) in hashDce()
98 cache->nrHashed = dce->endSlot; in hashDce()
99 if(dce->longName) in hashDce()
100 addNameToHash(cache, dce->longName); in hashDce()
101 addNameToHash(cache, dce->shortName); in hashDce()
104 int isHashed(dirCache_t *cache, wchar_t *name) in isHashed() argument
108 ret = _addHash(cache, calcHash(name), 1); in isHashed()
112 int growDirCache(dirCache_t *cache, unsigned int slot) in growDirCache() argument
119 if( cache->nr_entries <= slot) { in growDirCache()
122 cache->entries = realloc(cache->entries, in growDirCache()
125 if(!cache->entries) in growDirCache()
126 return -1; in growDirCache()
127 for(i= cache->nr_entries; i < (slot+1) * 2; i++) { in growDirCache()
128 cache->entries[i] = 0; in growDirCache()
130 cache->nr_entries = (slot+1) * 2; in growDirCache()
149 (*dcp)->entries = NewArray((slot+1)*2+5, dirCacheEntry_t *); in allocDirCache()
150 if(!(*dcp)->entries) { in allocDirCache()
154 (*dcp)->nr_entries = (slot+1) * 2; in allocDirCache()
155 memset( (*dcp)->bm0, 0, sizeof((*dcp)->bm0)); in allocDirCache()
156 memset( (*dcp)->bm1, 0, sizeof((*dcp)->bm1)); in allocDirCache()
157 memset( (*dcp)->bm2, 0, sizeof((*dcp)->bm1)); in allocDirCache()
158 (*dcp)->nrHashed = 0; in allocDirCache()
166 * on the begin of an entry. Entries which are cleared entirely are
167 * free'd. Entries which are cleared half-way (can only happen at end)
169 * If this was a range representing space after end-mark, return beginning
173 static int freeDirCacheRange(dirCache_t *cache, in freeDirCacheRange() argument
177 dirCacheEntry_t *entry; in freeDirCacheRange() local
189 entry = cache->entries[beginSlot]; in freeDirCacheRange()
190 if(!entry) { in freeDirCacheRange()
195 /* Due to the way this is called, we _always_ de-allocate in freeDirCacheRange()
198 assert(entry->beginSlot == beginSlot); in freeDirCacheRange()
200 clearEnd = entry->endSlot; in freeDirCacheRange()
206 cache->entries[i] = 0; in freeDirCacheRange()
208 entry->beginSlot = clearEnd; in freeDirCacheRange()
210 if(entry->beginSlot == entry->endSlot) { in freeDirCacheRange()
212 if(entry->endMarkPos != -1 && in freeDirCacheRange()
213 entry->endMarkPos < (int) beginSlot) in freeDirCacheRange()
216 if(entry->longName) in freeDirCacheRange()
217 free(entry->longName); in freeDirCacheRange()
218 if(entry->shortName) in freeDirCacheRange()
219 free(entry->shortName); in freeDirCacheRange()
220 free(entry); in freeDirCacheRange()
228 return -1; in freeDirCacheRange()
231 static dirCacheEntry_t *allocDirCacheEntry(dirCache_t *cache, in allocDirCacheEntry() argument
236 dirCacheEntry_t *entry; in allocDirCacheEntry() local
239 if(growDirCache(cache, endSlot) < 0) in allocDirCacheEntry()
242 entry = New(dirCacheEntry_t); in allocDirCacheEntry()
243 if(!entry) in allocDirCacheEntry()
245 entry->type = type; in allocDirCacheEntry()
246 entry->longName = 0; in allocDirCacheEntry()
247 entry->shortName = 0; in allocDirCacheEntry()
248 entry->beginSlot = beginSlot; in allocDirCacheEntry()
249 entry->endSlot = endSlot; in allocDirCacheEntry()
250 entry->endMarkPos = -1; in allocDirCacheEntry()
252 freeDirCacheRange(cache, beginSlot, endSlot); in allocDirCacheEntry()
254 cache->entries[i] = entry; in allocDirCacheEntry()
256 return entry; in allocDirCacheEntry()
259 dirCacheEntry_t *addUsedEntry(dirCache_t *cache, in addUsedEntry() argument
265 dirCacheEntry_t *entry; in addUsedEntry() local
269 "Bad slots %d %d in add used entry\n", in addUsedEntry()
275 entry = allocDirCacheEntry(cache, beginSlot, endSlot, DCET_USED); in addUsedEntry()
276 if(!entry) in addUsedEntry()
279 entry->beginSlot = beginSlot; in addUsedEntry()
280 entry->endSlot = endSlot; in addUsedEntry()
282 entry->longName = wcsdup(longName); in addUsedEntry()
283 entry->shortName = wcsdup(shortName); in addUsedEntry()
284 entry->dir = *dir; in addUsedEntry()
285 hashDce(cache, entry); in addUsedEntry()
286 return entry; in addUsedEntry()
294 static void mergeFreeSlots(dirCache_t *cache, unsigned int slot) in mergeFreeSlots() argument
301 previous = cache->entries[slot-1]; in mergeFreeSlots()
302 next = cache->entries[slot]; in mergeFreeSlots()
303 if(next && next->type == DCET_FREE && in mergeFreeSlots()
304 previous && previous->type == DCET_FREE) { in mergeFreeSlots()
305 for(i=next->beginSlot; i < next->endSlot; i++) in mergeFreeSlots()
306 cache->entries[i] = previous; in mergeFreeSlots()
307 previous->endSlot = next->endSlot; in mergeFreeSlots()
308 previous->endMarkPos = next->endMarkPos; in mergeFreeSlots()
315 dirCacheEntry_t *addFreeEndEntry(dirCache_t *cache, in addFreeEndEntry() argument
320 dirCacheEntry_t *entry; in addFreeEndEntry() local
322 if(beginSlot < cache->nrHashed) in addFreeEndEntry()
323 cache->nrHashed = beginSlot; in addFreeEndEntry()
326 fprintf(stderr, "Bad slots %d %d in add free entry\n", in addFreeEndEntry()
333 entry = allocDirCacheEntry(cache, beginSlot, endSlot, DCET_FREE); in addFreeEndEntry()
335 entry->endMarkPos = (int) beginSlot; in addFreeEndEntry()
336 mergeFreeSlots(cache, beginSlot); in addFreeEndEntry()
337 mergeFreeSlots(cache, endSlot); in addFreeEndEntry()
338 return cache->entries[beginSlot]; in addFreeEndEntry()
341 dirCacheEntry_t *addFreeEntry(dirCache_t *cache, in addFreeEntry() argument
345 return addFreeEndEntry(cache, beginSlot, endSlot, 0); in addFreeEntry()
348 dirCacheEntry_t *addEndEntry(dirCache_t *cache, unsigned int pos) in addEndEntry() argument
350 return allocDirCacheEntry(cache, pos, pos+1u, DCET_END); in addEndEntry()
353 dirCacheEntry_t *lookupInDircache(dirCache_t *cache, unsigned int pos) in lookupInDircache() argument
355 if(growDirCache(cache, pos+1) < 0) in lookupInDircache()
357 return cache->entries[pos]; in lookupInDircache()
362 dirCache_t *cache, **dcp; in freeDirCache() local
365 cache = *dcp; in freeDirCache()
366 if(cache) { in freeDirCache()
368 n=freeDirCacheRange(cache, 0, cache->nr_entries); in freeDirCache()
371 free(cache); in freeDirCache()