Lines Matching refs:table
66 struct lruhash* table = (struct lruhash*)calloc(1, in lruhash_create() local
68 if(!table) in lruhash_create()
70 lock_quick_init(&table->lock); in lruhash_create()
71 table->sizefunc = sizefunc; in lruhash_create()
72 table->compfunc = compfunc; in lruhash_create()
73 table->delkeyfunc = delkeyfunc; in lruhash_create()
74 table->deldatafunc = deldatafunc; in lruhash_create()
75 table->cb_arg = arg; in lruhash_create()
76 table->size = start_size; in lruhash_create()
77 table->size_mask = (int)(start_size-1); in lruhash_create()
78 table->lru_start = NULL; in lruhash_create()
79 table->lru_end = NULL; in lruhash_create()
80 table->num = 0; in lruhash_create()
81 table->space_used = 0; in lruhash_create()
82 table->space_max = maxmem; in lruhash_create()
83 table->array = calloc(table->size, sizeof(struct lruhash_bin)); in lruhash_create()
84 if(!table->array) { in lruhash_create()
85 lock_quick_destroy(&table->lock); in lruhash_create()
86 free(table); in lruhash_create()
89 bin_init(table->array, table->size); in lruhash_create()
90 lock_protect(&table->lock, table, sizeof(*table)); in lruhash_create()
91 lock_protect(&table->lock, table->array, in lruhash_create()
92 table->size*sizeof(struct lruhash_bin)); in lruhash_create()
93 return table; in lruhash_create()
97 bin_delete(struct lruhash* table, struct lruhash_bin* bin) in bin_delete() argument
109 (*table->delkeyfunc)(p->key, table->cb_arg); in bin_delete()
110 (*table->deldatafunc)(d, table->cb_arg); in bin_delete()
116 bin_split(struct lruhash* table, struct lruhash_bin* newa, in bin_split() argument
126 int newbit = newmask - table->size_mask; in bin_split()
130 for(i=0; i<table->size; i++) in bin_split()
132 lock_quick_lock(&table->array[i].lock); in bin_split()
133 p = table->array[i].overflow_list; in bin_split()
147 lock_quick_unlock(&table->array[i].lock); in bin_split()
152 lruhash_delete(struct lruhash* table) in lruhash_delete() argument
155 if(!table) in lruhash_delete()
158 lock_quick_destroy(&table->lock); in lruhash_delete()
159 for(i=0; i<table->size; i++) in lruhash_delete()
160 bin_delete(table, &table->array[i]); in lruhash_delete()
161 free(table->array); in lruhash_delete()
162 free(table); in lruhash_delete()
181 reclaim_space(struct lruhash* table, struct lruhash_entry** list) in reclaim_space() argument
185 log_assert(table); in reclaim_space()
187 while(table->num > 1 && table->space_used > table->space_max) { in reclaim_space()
194 d = table->lru_end; in reclaim_space()
198 table->lru_end = d->lru_prev; in reclaim_space()
201 bin = &table->array[d->hash & table->size_mask]; in reclaim_space()
202 table->num --; in reclaim_space()
208 table->space_used -= table->sizefunc(d->key, d->data); in reclaim_space()
209 if(table->markdelfunc) in reclaim_space()
210 (*table->markdelfunc)(d->key); in reclaim_space()
217 bin_find_entry(struct lruhash* table, in bin_find_entry() argument
222 if(p->hash == hash && table->compfunc(p->key, key) == 0) in bin_find_entry()
230 table_grow(struct lruhash* table) in table_grow() argument
235 if(table->size_mask == (int)(((size_t)-1)>>1)) { in table_grow()
240 newa = calloc(table->size*2, sizeof(struct lruhash_bin)); in table_grow()
246 bin_init(newa, table->size*2); in table_grow()
247 newmask = (table->size_mask << 1) | 1; in table_grow()
248 bin_split(table, newa, newmask); in table_grow()
250 lock_unprotect(&table->lock, table->array); in table_grow()
251 for(i=0; i<table->size; i++) { in table_grow()
252 lock_quick_destroy(&table->array[i].lock); in table_grow()
254 free(table->array); in table_grow()
256 table->size *= 2; in table_grow()
257 table->size_mask = newmask; in table_grow()
258 table->array = newa; in table_grow()
259 lock_protect(&table->lock, table->array, in table_grow()
260 table->size*sizeof(struct lruhash_bin)); in table_grow()
265 lru_front(struct lruhash* table, struct lruhash_entry* entry) in lru_front() argument
268 entry->lru_next = table->lru_start; in lru_front()
269 if(!table->lru_start) in lru_front()
270 table->lru_end = entry; in lru_front()
271 else table->lru_start->lru_prev = entry; in lru_front()
272 table->lru_start = entry; in lru_front()
276 lru_remove(struct lruhash* table, struct lruhash_entry* entry) in lru_remove() argument
280 else table->lru_start = entry->lru_next; in lru_remove()
283 else table->lru_end = entry->lru_prev; in lru_remove()
287 lru_touch(struct lruhash* table, struct lruhash_entry* entry) in lru_touch() argument
289 log_assert(table && entry); in lru_touch()
290 if(entry == table->lru_start) in lru_touch()
293 lru_remove(table, entry); in lru_touch()
295 lru_front(table, entry); in lru_touch()
299 lruhash_insert(struct lruhash* table, hashvalue_t hash, in lruhash_insert() argument
305 fptr_ok(fptr_whitelist_hash_sizefunc(table->sizefunc)); in lruhash_insert()
306 fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc)); in lruhash_insert()
307 fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc)); in lruhash_insert()
308 fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc)); in lruhash_insert()
309 fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc)); in lruhash_insert()
310 need_size = table->sizefunc(entry->key, data); in lruhash_insert()
311 if(cb_arg == NULL) cb_arg = table->cb_arg; in lruhash_insert()
314 lock_quick_lock(&table->lock); in lruhash_insert()
315 bin = &table->array[hash & table->size_mask]; in lruhash_insert()
319 if(!(found=bin_find_entry(table, bin, hash, entry->key))) { in lruhash_insert()
323 lru_front(table, entry); in lruhash_insert()
324 table->num++; in lruhash_insert()
325 table->space_used += need_size; in lruhash_insert()
328 table->space_used += need_size - in lruhash_insert()
329 (*table->sizefunc)(found->key, found->data); in lruhash_insert()
330 (*table->delkeyfunc)(entry->key, cb_arg); in lruhash_insert()
331 lru_touch(table, found); in lruhash_insert()
333 (*table->deldatafunc)(found->data, cb_arg); in lruhash_insert()
338 if(table->space_used > table->space_max) in lruhash_insert()
339 reclaim_space(table, &reclaimlist); in lruhash_insert()
340 if(table->num >= table->size) in lruhash_insert()
341 table_grow(table); in lruhash_insert()
342 lock_quick_unlock(&table->lock); in lruhash_insert()
348 (*table->delkeyfunc)(reclaimlist->key, cb_arg); in lruhash_insert()
349 (*table->deldatafunc)(d, cb_arg); in lruhash_insert()
355 lruhash_lookup(struct lruhash* table, hashvalue_t hash, void* key, int wr) in lruhash_lookup() argument
359 fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc)); in lruhash_lookup()
361 lock_quick_lock(&table->lock); in lruhash_lookup()
362 bin = &table->array[hash & table->size_mask]; in lruhash_lookup()
364 if((entry=bin_find_entry(table, bin, hash, key))) in lruhash_lookup()
365 lru_touch(table, entry); in lruhash_lookup()
366 lock_quick_unlock(&table->lock); in lruhash_lookup()
377 lruhash_remove(struct lruhash* table, hashvalue_t hash, void* key) in lruhash_remove() argument
382 fptr_ok(fptr_whitelist_hash_sizefunc(table->sizefunc)); in lruhash_remove()
383 fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc)); in lruhash_remove()
384 fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc)); in lruhash_remove()
385 fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc)); in lruhash_remove()
386 fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc)); in lruhash_remove()
388 lock_quick_lock(&table->lock); in lruhash_remove()
389 bin = &table->array[hash & table->size_mask]; in lruhash_remove()
391 if((entry=bin_find_entry(table, bin, hash, key))) { in lruhash_remove()
393 lru_remove(table, entry); in lruhash_remove()
395 lock_quick_unlock(&table->lock); in lruhash_remove()
399 table->num--; in lruhash_remove()
400 table->space_used -= (*table->sizefunc)(entry->key, entry->data); in lruhash_remove()
401 lock_quick_unlock(&table->lock); in lruhash_remove()
403 if(table->markdelfunc) in lruhash_remove()
404 (*table->markdelfunc)(entry->key); in lruhash_remove()
409 (*table->delkeyfunc)(entry->key, table->cb_arg); in lruhash_remove()
410 (*table->deldatafunc)(d, table->cb_arg); in lruhash_remove()
415 bin_clear(struct lruhash* table, struct lruhash_bin* bin) in bin_clear() argument
425 if(table->markdelfunc) in bin_clear()
426 (*table->markdelfunc)(p->key); in bin_clear()
428 (*table->delkeyfunc)(p->key, table->cb_arg); in bin_clear()
429 (*table->deldatafunc)(d, table->cb_arg); in bin_clear()
437 lruhash_clear(struct lruhash* table) in lruhash_clear() argument
440 if(!table) in lruhash_clear()
442 fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc)); in lruhash_clear()
443 fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc)); in lruhash_clear()
444 fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc)); in lruhash_clear()
446 lock_quick_lock(&table->lock); in lruhash_clear()
447 for(i=0; i<table->size; i++) { in lruhash_clear()
448 bin_clear(table, &table->array[i]); in lruhash_clear()
450 table->lru_start = NULL; in lruhash_clear()
451 table->lru_end = NULL; in lruhash_clear()
452 table->num = 0; in lruhash_clear()
453 table->space_used = 0; in lruhash_clear()
454 lock_quick_unlock(&table->lock); in lruhash_clear()
458 lruhash_status(struct lruhash* table, const char* id, int extended) in lruhash_status() argument
460 lock_quick_lock(&table->lock); in lruhash_status()
462 id, (unsigned)table->num, (unsigned)table->space_used, in lruhash_status()
463 (unsigned)table->space_max); in lruhash_status()
465 (unsigned)(table->num? table->space_used/table->num : 0), in lruhash_status()
466 (unsigned)table->size, table->size_mask); in lruhash_status()
469 int min=(int)table->size*2, max=-2; in lruhash_status()
470 for(i=0; i<table->size; i++) { in lruhash_status()
473 lock_quick_lock(&table->array[i].lock); in lruhash_status()
474 en = table->array[i].overflow_list; in lruhash_status()
479 lock_quick_unlock(&table->array[i].lock); in lruhash_status()
486 (double)table->num/(double)table->size, max); in lruhash_status()
488 lock_quick_unlock(&table->lock); in lruhash_status()
492 lruhash_get_mem(struct lruhash* table) in lruhash_get_mem() argument
495 lock_quick_lock(&table->lock); in lruhash_get_mem()
496 s = sizeof(struct lruhash) + table->space_used; in lruhash_get_mem()
498 if(table->size != 0) { in lruhash_get_mem()
500 for(i=0; i<table->size; i++) in lruhash_get_mem()
502 lock_get_mem(&table->array[i].lock); in lruhash_get_mem()
505 if(table->size != 0) in lruhash_get_mem()
506 s += (table->size)*(sizeof(struct lruhash_bin) + in lruhash_get_mem()
507 lock_get_mem(&table->array[0].lock)); in lruhash_get_mem()
509 lock_quick_unlock(&table->lock); in lruhash_get_mem()
510 s += lock_get_mem(&table->lock); in lruhash_get_mem()
515 lruhash_setmarkdel(struct lruhash* table, lruhash_markdelfunc_t md) in lruhash_setmarkdel() argument
517 lock_quick_lock(&table->lock); in lruhash_setmarkdel()
518 table->markdelfunc = md; in lruhash_setmarkdel()
519 lock_quick_unlock(&table->lock); in lruhash_setmarkdel()