From 09a82c2ece4caadad0baa0d1f3b84f1506363fdd Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期五, 22 一月 2021 11:58:33 +0800 Subject: [PATCH] update --- src/shm/hashtable.cpp | 320 ++++++++++++++--------------------------------------- 1 files changed, 85 insertions(+), 235 deletions(-) diff --git a/src/shm/hashtable.cpp b/src/shm/hashtable.cpp index 701bb17..60633bc 100755 --- a/src/shm/hashtable.cpp +++ b/src/shm/hashtable.cpp @@ -24,29 +24,27 @@ static size_t hashcode(int key); -static struct timespec TIMEOUT = {2, 0}; - void hashtable_init(hashtable_t *hashtable ) { memset(hashtable, 0, sizeof(hashtable_t)); hashtable->mutex = svsem_get(IPC_PRIVATE, 1); - hashtable->wlock = svsem_get(IPC_PRIVATE, 1); - hashtable->cond = svsem_get(IPC_PRIVATE, 1); - hashtable->readcnt = 0; + // hashtable->wlock = svsem_get(IPC_PRIVATE, 1); + // hashtable->cond = svsem_get(IPC_PRIVATE, 1); + // hashtable->readcnt = 0; - FILE * semfile = fopen("./sem.txt", "w+"); - if(semfile == NULL) { - err_exit(errno, "fopen"); - } - fprintf(semfile, "hashtable->mutex=%d\n", hashtable->mutex); - fclose(semfile); + // FILE * semfile = fopen("./sem.txt", "w+"); + // if(semfile == NULL) { + // err_exit(errno, "fopen"); + // } + // fprintf(semfile, "hashtable->mutex=%d\n", hashtable->mutex); + // fclose(semfile); } void hashtable_destroy(hashtable_t *hashtable) { svsem_remove( hashtable->mutex); - svsem_remove( hashtable->wlock); - svsem_remove( hashtable->cond); + // svsem_remove( hashtable->wlock); + // svsem_remove( hashtable->cond); } @@ -111,17 +109,17 @@ void *oldvalue; int rv; - if( (rv = svsem_wait(hashtable->wlock)) != 0) { + if( (rv = svsem_wait(hashtable->mutex)) != 0) { LoggerFactory::getLogger()->error(rv, "hashtable_remove\n"); } tailq_header_t *my_tailq_head = hashtable->array[code] ; if ( my_tailq_head == NULL) { - svsem_post(hashtable->wlock); + if((rv = svsem_post(hashtable->mutex)) != 0) { + LoggerFactory::getLogger()->error(rv, "hashtable_remove\n"); + } return NULL; - } - else - { + } else { for (item = TAILQ_FIRST(my_tailq_head); item != NULL; item = TAILQ_NEXT(item, joint)) { if (key == item->key) @@ -132,197 +130,39 @@ /* mm_free the item as we don't need it anymore. */ mm_free(item); - svsem_post(hashtable->wlock); + svsem_post(hashtable->mutex); return oldvalue; } } - } - if((rv = svsem_post(hashtable->wlock)) != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_remove\n"); - } - return NULL; - -} - - - - - -void hashtable_removeall(hashtable_t *hashtable) -{ - tailq_entry_t *item; - int rv; - rv = svsem_wait(hashtable->wlock); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_removeall\n"); - } - for (int i = 0; i < MAPSIZE; i++) - { - tailq_header_t *my_tailq_head = hashtable->array[i] ; - - if (my_tailq_head == NULL ) - continue; - - while ((item = TAILQ_FIRST(my_tailq_head)) ) - { - TAILQ_REMOVE(my_tailq_head, item, joint); - mm_free(item); + if((rv = svsem_post(hashtable->mutex)) != 0) { + LoggerFactory::getLogger()->error(rv, "hashtable_remove\n"); } - mm_free(my_tailq_head); - hashtable->array[i] = NULL; - } - rv = svsem_post(hashtable->wlock); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_removeall\n"); + + return NULL; } } -/** - * for debug - */ -void hashtable_printall(hashtable_t *hashtable) -{ - tailq_entry_t *item; - for (int i = 0; i < MAPSIZE; i++) - { - tailq_header_t *my_tailq_head = hashtable->array[i] ; - if (my_tailq_head == NULL ) - continue; - printf("code=%d\n", i); - TAILQ_FOREACH(item, my_tailq_head, joint) - { - printf("%d:%s\n", item->key, (char *)item->value); - } - printf("\n"); - } -} - -static size_t hashcode(int key) -{ - - return key % MAPSIZE; - /*printf("hashfun = %ld\n", code);*/ -} void *hashtable_get(hashtable_t *hashtable, int key) { -LoggerFactory::getLogger()->debug( "==========hashtable_get before 1"); - - int rv; - rv = svsem_wait(hashtable->mutex); - -LoggerFactory::getLogger()->debug( "==========hashtable_get before 2"); - - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_get 1"); - } - hashtable->readcnt++; - if (hashtable->readcnt == 1) { - //鑾峰彇璇诲啓閿� -LoggerFactory::getLogger()->debug( "==========hashtable_get before 3"); - rv = svsem_wait(hashtable->wlock); -LoggerFactory::getLogger()->debug( "==========hashtable_get before 4"); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_get 2"); - } - } - rv = svsem_post(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_get 3"); - } - // ================ - void * res = _hashtable_get(hashtable, key); - - // ================== - - rv = svsem_wait(hashtable->mutex); -LoggerFactory::getLogger()->debug( "==========hashtable_get before 5"); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_get 4"); - } - hashtable->readcnt--; - if(hashtable->readcnt == 0) { - //閲婃斁璇诲啓閿� - - rv = svsem_post(hashtable->wlock); -LoggerFactory::getLogger()->debug( "==========hashtable_get before 6"); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_get 5"); - } - //閫氱煡鍐� - rv = svsem_set(hashtable->cond, 1); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_get 6"); - } - } - - rv = svsem_post(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_get 7"); - } -LoggerFactory::getLogger()->debug( "==========hashtable_get after"); return res; } void hashtable_put(hashtable_t *hashtable, int key, void *value) { int rv; -LoggerFactory::getLogger()->debug( "==========hashtable_put before 1"); - rv = svsem_wait(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); - } -LoggerFactory::getLogger()->debug( "==========hashtable_put before 2"); - // 璁剧疆璇讳紭鍏堢骇楂� - while (hashtable->readcnt > 0) - { - rv = svsem_set(hashtable->cond, 0); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); - } - rv = svsem_post(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); - } - //绛夊緟鍐欓�氱煡 -LoggerFactory::getLogger()->debug( "==========hashtable_put before 3"); - rv = svsem_wait(hashtable->cond); -LoggerFactory::getLogger()->debug( "==========hashtable_put before 4"); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); - } - - - rv = svsem_wait(hashtable->mutex); -LoggerFactory::getLogger()->debug( "==========hashtable_put before 5"); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); - } - } - rv = svsem_post(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); - } - - //鑾峰彇璇诲啓閿� - rv = svsem_wait(hashtable->wlock); -LoggerFactory::getLogger()->debug( "==========hashtable_put before 6"); - if(rv != 0) { + if(( rv = svsem_wait(hashtable->mutex)) != 0) { LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); } _hashtable_put(hashtable, key, value); - //閲婃斁璇诲啓閿� - rv = svsem_post(hashtable->wlock); - if(rv != 0) { + if(( rv = svsem_post(hashtable->mutex)) != 0) { LoggerFactory::getLogger()->error(rv, "hashtable_put\n"); } - - LoggerFactory::getLogger()->debug( "==========hashtable_put after"); } @@ -344,56 +184,7 @@ void hashtable_foreach(hashtable_t *hashtable, std::function<void(int, void *)> cb) { - int rv; - - - LoggerFactory::getLogger()->debug("===hashtable_foreach before 1\n"); - - - rv = svsem_wait(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_foreach"); - } - hashtable->readcnt++; - if (hashtable->readcnt == 1) { - //鑾峰彇璇诲啓閿� - rv = svsem_wait(hashtable->wlock); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_foreach"); - } - } - rv = svsem_post(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_foreach"); - } - - // ================== - - _hashtable_foreach(hashtable, cb); - - // ================== - - rv = svsem_wait(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_foreach"); - } - hashtable->readcnt--; - if(hashtable->readcnt == 0) { - //閲婃斁璇诲啓閿� - rv = svsem_post(hashtable->wlock); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_foreach"); - } - //閫氱煡鍐� - rv = svsem_set(hashtable->cond, 1); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_foreach"); - } - } - rv = svsem_post(hashtable->mutex); - if(rv != 0) { - LoggerFactory::getLogger()->error(rv, "hashtable_foreach"); - } + return _hashtable_foreach(hashtable, cb); } @@ -419,7 +210,7 @@ int hashtable_alloc_key(hashtable_t *hashtable) { int rv; int key = START_KEY; - rv = svsem_wait(hashtable->wlock); + rv = svsem_wait(hashtable->mutex); if(rv != 0) { LoggerFactory::getLogger()->error(rv, "hashtable_alloc_key\n"); } @@ -430,9 +221,68 @@ // 鍗犵敤key _hashtable_put(hashtable, key, (void *)1); - rv = svsem_post(hashtable->wlock); + rv = svsem_post(hashtable->mutex); if(rv != 0) { LoggerFactory::getLogger()->error(rv, "hashtable_alloc_key\n"); } return key; } + + +void hashtable_removeall(hashtable_t *hashtable) +{ + tailq_entry_t *item; + int rv; + if( (rv = svsem_wait(hashtable->mutex)) != 0) { + LoggerFactory::getLogger()->error(rv, "hashtable_removeall\n"); + } + for (int i = 0; i < MAPSIZE; i++) + { + tailq_header_t *my_tailq_head = hashtable->array[i] ; + + if (my_tailq_head == NULL ) + continue; + + while ((item = TAILQ_FIRST(my_tailq_head)) ) + { + TAILQ_REMOVE(my_tailq_head, item, joint); + mm_free(item); + } + mm_free(my_tailq_head); + hashtable->array[i] = NULL; + } + + if((rv = svsem_post(hashtable->mutex)) != 0) { + LoggerFactory::getLogger()->error(rv, "hashtable_removeall\n"); + } +} + + +static size_t hashcode(int key) +{ + + return key % MAPSIZE; + /*printf("hashfun = %ld\n", code);*/ +} + +/** + * for debug + */ +static void hashtable_printall(hashtable_t *hashtable) +{ + tailq_entry_t *item; + for (int i = 0; i < MAPSIZE; i++) + { + tailq_header_t *my_tailq_head = hashtable->array[i] ; + + if (my_tailq_head == NULL ) + continue; + + printf("code=%d\n", i); + TAILQ_FOREACH(item, my_tailq_head, joint) + { + printf("%d:%s\n", item->key, (char *)item->value); + } + printf("\n"); + } +} \ No newline at end of file -- Gitblit v1.8.0