Home | History | Annotate | Download | only in util

Lines Matching refs:dict

22 #include "dict.h"
72 #define DICT_LOCK(dict) \
73 do { if((dict)->threaded) { sched_yield(); \
74 mLock(&(dict)->mList); } } while(0)
77 #define DICT_LOCK(dict) \
78 if((dict)->threaded) mLock(&(dict)->mList)
81 #define DICT_UNLOCK(dict) \
82 if((dict)->threaded) mUnlock(&(dict)->mList)
85 static NEOERR *dictNewItem(dictCtx dict, dictEntryPtr entry,
131 static void dictFreeItem(dictCtx dict, dictItemPtr item) {
133 if(dict->freeValue)
134 dict->freeValue(item->value, dict->freeRock);
142 static dictItemPtr dictFindItem(dictCtx dict, dictEntryPtr entry,
151 if(! dict->comp(item->id, id)) {
165 static NEOERR *dictUpdate(dictCtx dict, dictEntryPtr entry, const char *id,
180 if((item = dictFindItem(dict, entry, id, FALSE))) {
184 if(dict->freeValue)
185 dict->freeValue(item->value, dict->freeRock);
196 if(dict->freeValue)
197 dict->freeValue(item->value, dict->freeRock);
209 err = dictNewItem(dict, entry, id, newval, &item);
214 skipRelease(dict->list, lock);
219 static NEOERR *dictInsert(dictCtx dict, UINT32 hash, const char *id,
232 err = dictNewItem(dict, entry, id, newval, NULL);
236 if((err = skipInsert(dict->list, hash, entry, FALSE)) == STATUS_OK)
240 if(dict->freeValue && ! newval->value)
241 dict->freeValue(entry->first->value, dict->freeRock);
251 entry = skipSearch(dict->list, hash, &lock);
254 return nerr_pass(dictUpdate(dict, entry, id, newval, lock));
257 static UINT32 dictHash(dictCtx dict, const char *id) {
261 hash = dict->hash(id) % DICT_HASH_BITS;
270 static NEOERR *dictModify(dictCtx dict, const char *id, dictValuePtr newval)
277 hash = dictHash(dict, id);
280 entry = skipSearch(dict->list, hash, &lock);
282 DICT_LOCK(dict);
284 if((err = dictUpdate(dict, entry, id, newval, lock)) != STATUS_OK)
288 err = dictInsert(dict, hash, id, newval);
291 DICT_UNLOCK(dict);
296 NEOERR *dictSetValue(dictCtx dict, const char *id, void *value) {
304 return dictModify(dict, id, &newval);
307 NEOERR *dictModifyValue(dictCtx dict, const char *id, dictNewValueCB new,
320 return dictModify(dict, id, &newval);
323 void dictReleaseLock(dictCtx dict, void *lock) {
326 DICT_UNLOCK(dict);
329 skipRelease(dict->list, lock);
334 void dictCleanup(dictCtx dict, dictCleanupFunc cleanup, void *rock) {
341 while((entry = skipNext(dict->list, &key, &lock))) {
343 DICT_LOCK(dict);
355 dictFreeItem(dict, item);
368 skipDelete(dict->list, key);
371 dictReleaseLock(dict, lock);
377 void *dictSearch(dictCtx dict, const char *id, void **plock) {
385 hash = dictHash(dict, id);
388 if(! (entry = skipSearch(dict->list, hash, &lock)))
392 DICT_LOCK(dict);
395 if((item = dictFindItem(dict, entry, id, FALSE))) {
402 dictReleaseLock(dict, lock);
407 dictReleaseLock(dict, lock);
412 void *dictNext (dictCtx dict, char **id, void **plock)
425 if(! (entry = skipNext (dict->list, &hash, &lock)))
429 DICT_LOCK(dict);
442 dictReleaseLock(dict, lock);
447 dictReleaseLock(dict, lock);
453 hash = dictHash(dict, *id);
456 entry = skipSearch (dict->list, hash, &lock);
460 entry = skipNext (dict->list, &hash, &lock);
461 /* Not found, we're at the end of the dict */
467 DICT_LOCK(dict);
469 item = dictFindItem(dict, entry, *id, FALSE);
479 entry = skipNext (dict->list, &hash, &lock);
480 /* Not found, we're at the end of the dict */
484 dictReleaseLock(dict, lock);
495 dictReleaseLock(dict, lock);
500 dictReleaseLock(dict, lock);
506 BOOL dictRemove(dictCtx dict, const char *id) {
513 hash = dictHash(dict, id);
516 if(! (entry = skipSearch(dict->list, hash, &lock)))
520 DICT_LOCK(dict);
523 if((item = dictFindItem(dict, entry, id, TRUE)))
524 dictFreeItem(dict, item);
526 dictReleaseLock(dict, lock);
555 dictCtx dict;
561 if(! (dict = calloc(1, sizeof(struct _dictCtx))))
564 dict->useCase = useCase;
565 dict->hash = python_string_hash;
567 dict->comp = strcmp;
570 /* dict->hash = uhashUpper; */
571 dict->comp = strcasecmp;
574 dict->threaded = threaded;
575 dict->freeValue = freeValue;
576 dict->freeRock = freeRock;
578 err = skipNewList(&(dict->list), threaded, root, maxLevel,
579 flushLimit, dictDestroyEntry, dict);
584 err = mCreate(&(dict->mList));
588 *rdict = dict;
593 dictDestroy(dict);
598 void dictDestroy(dictCtx dict) {
600 if(! dict)
603 skipFreeList(dict->list);
605 mDestroy(&dict->mList);
607 free(dict);