From f85c9b875b060681b51f57b15074ba1c7c9f5636 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期一, 20 七月 2020 11:10:02 +0800 Subject: [PATCH] update --- queue/shm_queue_wrapper.c | 64 +++++++++++++++++++++++--------- 1 files changed, 46 insertions(+), 18 deletions(-) diff --git a/queue/shm_queue_wrapper.c b/queue/shm_queue_wrapper.c index 03cc97f..f680018 100644 --- a/queue/shm_queue_wrapper.c +++ b/queue/shm_queue_wrapper.c @@ -1,6 +1,6 @@ #include "shm_queue_wrapper.h" -#include "mm.h" +#include "mem_pool.h" #include "hashtable.h" typedef struct ele_t { @@ -12,23 +12,29 @@ void *mqueue; } shmqueue_t; + + +//绉婚櫎涓嶅寘鍚湪keys涓殑闃熷垪 +void shm_remove_queues_exclue(void *keys, int length) { + SHMQueue<ele_t>::remove_queues_exclue((int*)keys, (size_t)length); +} + /** * 鍒涘缓闃熷垪 * @ shmqueue * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�鏍囪瘑, key鏄竴涓寚閽堥噷闈㈠瓨鍌ㄤ簡key鐨勫�硷紝 濡傛灉key鐨勫�间负-1绯荤粺浼氳嚜鍔ㄥ垎閰嶄竴涓猭ey鍊煎苟鎶婅key鐨勫�艰祴缁檏ey鎸囬拡銆傚鏋渒ey鐨勫�间笉浼氱┖浼氭鏌ユ槸鍚︽湁閲嶅缁戝畾鐨勬儏鍐�, 鏈夐噸澶嶅氨鎶ラ敊娌℃湁灏卞垱寤洪槦鍒楀苟缁戝畾key. * @ queue_size 闃熷垪澶у皬 - * @ size 闃熷垪涓厓绱犲ぇ灏� */ void* shmqueue_create( int * key, int queue_size) { int mkey; - hashtable_t *hashtable = get_mm_hashtable(); + hashtable_t *hashtable = mm_get_hashtable(); if(*key == -1) { mkey = hashtable_alloc_key(hashtable); *key = mkey; } else { mkey = *key; if(hashtable_get(hashtable, mkey)!= NULL) { - err_msg(0, "key %d has already been in used!", mkey); + err_exit(0, "key %d has already been in used!", mkey); return NULL; } } @@ -40,12 +46,12 @@ } /** - * 缁戝畾key鍒伴槦鍒楋紝浣嗘槸骞朵笉浼氬垱寤洪槦鍒椼�傚鏋滄病鏈夊搴旀寚瀹歬ey鐨勯槦鍒楁彁绀洪敊璇苟杩斿洖绌哄�� + * 缁戝畾key鍒伴槦鍒楋紝浣嗘槸骞朵笉浼氬垱寤洪槦鍒椼�傚鏋滄病鏈夊搴旀寚瀹歬ey鐨勯槦鍒楁彁绀洪敊璇苟閫�鍑� */ void* shmqueue_attach(int key) { - hashtable_t *hashtable = get_mm_hashtable(); + hashtable_t *hashtable = mm_get_hashtable(); if(hashtable_get(hashtable, key)== NULL) { - err_msg(0, "shmqueue_attach锛歛ttach failed, The queue binding on key %d has not been created!", key); + err_exit(0, "shmqueue_attach锛歛ttach queue at key %d failed!", key); return NULL; } @@ -114,27 +120,33 @@ /** * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆闃熶笉鎴愬姛灏辫繑鍥� - * timespec {sec绉�, nsec绾崇} + * @sec绉� + * @nsec绾崇 */ -int shmqueue_push_timeout(void * _shmqueue, void *src, int size, void * _timeout) { - struct timespec *timeout = (struct timespec *)_timeout; +int shmqueue_push_timeout(void * _shmqueue, void *src, int size, int sec, int nsec) { + + struct timespec timeout = {sec, nsec}; shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; ele_t dest; dest.size = size; dest.buf = mm_malloc(size); memcpy(dest.buf, src, size); - return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest, timeout); + return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest, &timeout); } /** * 鍑洪槦, 闃熷垪绌烘椂绛夊緟 */ -int shmqueue_pop(void * _shmqueue, void *dest) { +int shmqueue_pop(void * _shmqueue, void **dest, int *size) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; ele_t src; + bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src); if (rv) { - memcpy(dest, src.buf, src.size); + void * _dest = malloc(src.size); + memcpy(_dest, src.buf, src.size); + *dest = _dest; + *size = src.size; mm_free(src.buf); return 1; } else { @@ -146,12 +158,16 @@ /** * 鍑洪槦, 闃熷垪绌烘椂绔嬪嵆杩斿洖 */ -int shmqueue_pop_nowait(void * _shmqueue, void *dest) { +int shmqueue_pop_nowait(void * _shmqueue, void **dest, int *size) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; ele_t src; + bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src); if (rv) { + void * _dest = malloc(src.size); memcpy(dest, src.buf, src.size); + *dest = _dest; + *size = src.size; mm_free(src.buf); return 1; } else { @@ -161,17 +177,29 @@ /** * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭闃熶笉鎴愬姛灏辫繑鍥� + * @sec绉� + * @nsec绾崇 */ -int shmqueue_pop_timeout(void * _shmqueue, void *dest, void * _timeout) { - struct timespec *timeout = (struct timespec *)_timeout; +int shmqueue_pop_timeout(void * _shmqueue, void **dest, int *size, int sec, int nsec) { + struct timespec timeout = {sec, nsec}; shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; ele_t src; - bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src, timeout); + + bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src, &timeout); if (rv) { - memcpy(dest, src.buf, src.size); + void * _dest = malloc(src.size); + memcpy(_dest, src.buf, src.size); + *dest = _dest; + *size = src.size; mm_free(src.buf); return 1; } else { return 0; } } + +void shmqueue_free(void *ptr) { + free(ptr); +} + + -- Gitblit v1.8.0