From e1e97f1f98baf82efcd5825d7c7a7b4b1b2f2e40 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期一, 13 七月 2020 19:03:21 +0800 Subject: [PATCH] udpate --- queue/shm_queue_wrapper.c | 117 +++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 78 insertions(+), 39 deletions(-) diff --git a/queue/shm_queue_wrapper.c b/queue/shm_queue_wrapper.c index daa3f1e..03cc97f 100644 --- a/queue/shm_queue_wrapper.c +++ b/queue/shm_queue_wrapper.c @@ -1,48 +1,75 @@ #include "shm_queue_wrapper.h" -#define MAX_ELE_SIZE 512 + +#include "mm.h" +#include "hashtable.h" typedef struct ele_t { - char buf[MAX_ELE_SIZE]; + size_t size; + void * buf; } ele_t; typedef struct shmqueue_t { - size_t ele_size; void *mqueue; } shmqueue_t; /** - * 鍒濆鍖� + * 鍒涘缓闃熷垪 * @ shmqueue - * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�key + * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�鏍囪瘑, key鏄竴涓寚閽堥噷闈㈠瓨鍌ㄤ簡key鐨勫�硷紝 濡傛灉key鐨勫�间负-1绯荤粺浼氳嚜鍔ㄥ垎閰嶄竴涓猭ey鍊煎苟鎶婅key鐨勫�艰祴缁檏ey鎸囬拡銆傚鏋渒ey鐨勫�间笉浼氱┖浼氭鏌ユ槸鍚︽湁閲嶅缁戝畾鐨勬儏鍐�, 鏈夐噸澶嶅氨鎶ラ敊娌℃湁灏卞垱寤洪槦鍒楀苟缁戝畾key. * @ queue_size 闃熷垪澶у皬 - * @ ele_size 闃熷垪涓厓绱犲ぇ灏� + * @ size 闃熷垪涓厓绱犲ぇ灏� */ -void* shmqueue_init( int key, int queue_size, int ele_size) { - if(ele_size > MAX_ELE_SIZE) { - err_exit(0, "shmqueue_init : the element size is supper than max element buffer size"); +void* shmqueue_create( int * key, int queue_size) { + int mkey; + hashtable_t *hashtable = get_mm_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); + return NULL; + } } + shmqueue_t *shmqueue = (shmqueue_t*)malloc(sizeof(shmqueue_t)); - SHMQueue<ele_t> *queue = new SHMQueue<ele_t>(key, queue_size); + SHMQueue<ele_t> *queue = new SHMQueue<ele_t>(mkey, queue_size); shmqueue->mqueue = (void *)queue; - shmqueue->ele_size = ele_size; + return (void *)shmqueue; +} + +/** + * 缁戝畾key鍒伴槦鍒楋紝浣嗘槸骞朵笉浼氬垱寤洪槦鍒椼�傚鏋滄病鏈夊搴旀寚瀹歬ey鐨勯槦鍒楁彁绀洪敊璇苟杩斿洖绌哄�� + */ +void* shmqueue_attach(int key) { + hashtable_t *hashtable = get_mm_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); + return NULL; + } + + shmqueue_t *shmqueue = (shmqueue_t*)malloc(sizeof(shmqueue_t)); + SHMQueue<ele_t> *queue = new SHMQueue<ele_t>(key, 0); + shmqueue->mqueue = (void *)queue; return (void *)shmqueue; } /** * 閿�姣� */ -void shmqueue_destroy(void * _shmqueue) { +void shmqueue_drop(void * _shmqueue) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; delete (SHMQueue<ele_t> *)shmqueue->mqueue; - delete _shmqueue; + delete shmqueue; } /** * 闃熷垪鍏冪礌鐨勪釜鏁� */ -uint32_t shmqueue_size(void * _shmqueue) { +int shmqueue_size(void * _shmqueue) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; - return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->size(); + return (int)(((SHMQueue<ele_t> *)(shmqueue->mqueue))->size()) ; } /** @@ -64,42 +91,51 @@ /** * 鍏ラ槦, 闃熷垪婊℃椂绛夊緟 */ -int shmqueue_push(void * _shmqueue, void *src_ele) { +int shmqueue_push(void * _shmqueue, void *src, int size) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; - ele_t dest_ele; - memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size); - return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push(dest_ele); + ele_t dest; + dest.size = size; + dest.buf = mm_malloc(size); + memcpy(dest.buf, src, size); + return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push(dest); } /** * 鍏ラ槦, 闃熷垪婊℃椂绔嬪嵆杩斿洖 */ -int shmqueue_push_nowait(void * _shmqueue, void *src_ele) { +int shmqueue_push_nowait(void * _shmqueue, void *src, int size) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; - ele_t dest_ele; - memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size); - return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_nowait(dest_ele); + ele_t dest; + dest.size = size; + dest.buf = mm_malloc(size); + memcpy(dest.buf, src, size); + return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_nowait(dest); } /** * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆闃熶笉鎴愬姛灏辫繑鍥� + * timespec {sec绉�, nsec绾崇} */ -int shmqueue_push_timeout(void * _shmqueue, void *src_ele, struct timespec * timeout) { +int shmqueue_push_timeout(void * _shmqueue, void *src, int size, void * _timeout) { + struct timespec *timeout = (struct timespec *)_timeout; shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; - ele_t dest_ele; - memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size); - return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest_ele, timeout); + 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); } /** * 鍑洪槦, 闃熷垪绌烘椂绛夊緟 */ -int shmqueue_pop(void * _shmqueue, void *dest_ele) { +int shmqueue_pop(void * _shmqueue, void *dest) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; - ele_t src_ele; - bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src_ele); + ele_t src; + bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src); if (rv) { - memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size); + memcpy(dest, src.buf, src.size); + mm_free(src.buf); return 1; } else { return 0; @@ -110,12 +146,13 @@ /** * 鍑洪槦, 闃熷垪绌烘椂绔嬪嵆杩斿洖 */ -int shmqueue_pop_nowait(void * _shmqueue, void *dest_ele) { +int shmqueue_pop_nowait(void * _shmqueue, void *dest) { shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; - ele_t src_ele; - bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src_ele); + ele_t src; + bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src); if (rv) { - memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size); + memcpy(dest, src.buf, src.size); + mm_free(src.buf); return 1; } else { return 0; @@ -125,12 +162,14 @@ /** * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭闃熶笉鎴愬姛灏辫繑鍥� */ -int shmqueue_pop_timeout(void * _shmqueue, void *dest_ele, struct timespec * timeout) { +int shmqueue_pop_timeout(void * _shmqueue, void *dest, void * _timeout) { + struct timespec *timeout = (struct timespec *)_timeout; shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue; - ele_t src_ele; - bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src_ele, timeout); + ele_t src; + bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src, timeout); if (rv) { - memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size); + memcpy(dest, src.buf, src.size); + mm_free(src.buf); return 1; } else { return 0; -- Gitblit v1.8.0