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