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