Lines Matching refs:cache

124     CTABLE *cache = (CTABLE *) mymalloc(sizeof(CTABLE));  in ctable_create()  local
130 cache->table = htable_create(limit); in ctable_create()
131 cache->limit = (limit < CTABLE_MIN_SIZE ? CTABLE_MIN_SIZE : limit); in ctable_create()
132 cache->used = 0; in ctable_create()
133 cache->create = create; in ctable_create()
134 cache->delete = delete; in ctable_create()
135 ring_init(RING_PTR_OF(cache)); in ctable_create()
136 cache->context = context; in ctable_create()
137 return (cache); in ctable_create()
142 const void *ctable_locate(CTABLE *cache, const char *key) in ctable_locate() argument
153 if ((entry = (CTABLE_ENTRY *) htable_find(cache->table, key)) == 0) { in ctable_locate()
154 if (cache->used >= cache->limit) { in ctable_locate()
155 entry = RING_TO_CTABLE_ENTRY(ring_pred(RING_PTR_OF(cache))); in ctable_locate()
159 cache->delete(entry->value, cache->context); in ctable_locate()
160 htable_delete(cache->table, entry->key, (void (*) (void *)) 0); in ctable_locate()
163 cache->used++; in ctable_locate()
165 entry->value = cache->create(key, cache->context); in ctable_locate()
166 entry->key = htable_enter(cache->table, key, (void *) entry)->key; in ctable_locate()
167 ring_append(RING_PTR_OF(cache), RING_PTR_OF(entry)); in ctable_locate()
170 } else if (entry == RING_TO_CTABLE_ENTRY(ring_succ(RING_PTR_OF(cache)))) { in ctable_locate()
175 ring_append(RING_PTR_OF(cache), RING_PTR_OF(entry)); in ctable_locate()
184 const void *ctable_refresh(CTABLE *cache, const char *key) in ctable_refresh() argument
190 if ((entry = (CTABLE_ENTRY *) htable_find(cache->table, key)) == 0) in ctable_refresh()
191 return ctable_locate(cache, key); in ctable_refresh()
194 cache->delete(entry->value, cache->context); in ctable_refresh()
195 entry->value = cache->create(key, cache->context); in ctable_refresh()
198 if (entry != RING_TO_CTABLE_ENTRY(ring_succ(RING_PTR_OF(cache)))) { in ctable_refresh()
200 ring_append(RING_PTR_OF(cache), RING_PTR_OF(entry)); in ctable_refresh()
209 void ctable_newcontext(CTABLE *cache, void *context) in ctable_newcontext() argument
211 cache->context = context; in ctable_newcontext()
228 void ctable_free(CTABLE *cache) in ctable_free() argument
236 ctable_free_cache = cache; in ctable_free()
237 htable_free(cache->table, ctable_free_callback); in ctable_free()
238 myfree((void *) cache); in ctable_free()
244 void ctable_walk(CTABLE *cache, void (*action) (const char *, const void *)) in ctable_walk() argument
246 RING *entry = RING_PTR_OF(cache); in ctable_walk()
250 while ((entry = ring_succ(entry)) != RING_PTR_OF(cache)) in ctable_walk()
293 CTABLE *cache; in main() local
299 cache = ctable_create(1, ask, drop, (void *) data_buf); in main()
313 value = ctable_locate(cache, STR(key_buf)); in main()
317 ctable_free(cache); in main()