From 5854093bd0622c03576e7a29205d68bbdc264f62 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 09 七月 2020 16:10:20 +0800
Subject: [PATCH] void queue wrapper
---
queue/libshm_queue.a | 0
/dev/null | 71 -----------
test2/test_queue_wrapper | 0
test/Makefile | 2
test2/test_queue_wrapper.c | 9
queue/shm_queue_wrapper.c | 138 +++++++++++++++++++++++
queue/include/shm_queue_wrapper.h | 97 ++-------------
README.md | 5
8 files changed, 160 insertions(+), 162 deletions(-)
diff --git a/README.md b/README.md
index 29dd32a..a174f32 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,7 @@
return 0;
}
```
+
## 鎺ュ彛璇存槑
```
@@ -110,7 +111,7 @@
inline int shmqueue_push_nowait(shmqueue_t *shmqueue, void *src_ele)
/**
- * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆瀵逛笉鎴愬姛灏辫繑鍥�
+ * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆闃熶笉鎴愬姛灏辫繑鍥�
*/
inline int shmqueue_push_timeout(shmqueue_t *shmqueue, void *src_ele, struct timespec * timeout)
/**
@@ -123,7 +124,7 @@
*/
inline int shmqueue_pop_nowait(shmqueue_t *shmqueue, void *dest_ele)
/**
- * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭瀵逛笉鎴愬姛灏辫繑鍥�
+ * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭闃熶笉鎴愬姛灏辫繑鍥�
*/
inline int shmqueue_pop_timeout(shmqueue_t *shmqueue, void *dest_ele, struct timespec * timeout)
diff --git a/queue/include/queue_factory.h b/queue/include/queue_factory.h
deleted file mode 100644
index 67537c6..0000000
--- a/queue/include/queue_factory.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// #ifndef QFACTORY_H
-// #define QFACTORY_H
-// #include "usg_common.h"
-// #include "mm.h"
-// #include "hashtable.h"
-// #include "lock_free_queue.h"
-
-// class QueueFactory{
-
-// private:
-
-// static hashtable_t * getHashTable() {
-// static hashtable_t *hashtable = NULL;
-// int first;
-
-// if(hashtable == NULL) {
-// first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
-// if (first)
-// hashtable_init(hashtable);
-// }
-// return hashtable;
-
-// }
-
-
-// template <typename T> static
-// LockFreeQueue<T>* _createQueue(int key, size_t size = 16) {
-// LockFreeQueue<T> *queue;
-// hashtable_t *hashtable = getHashTable();
-// //LockFreeQueue<int, 10000> q;
-// if ((queue = (LockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
-// queue = new LockFreeQueue<T>(size);
-// hashtable_put(hashtable, key, (void *)queue);
-// }
-
-
-// return queue;
-// }
-
-
-// public:
-
-// template <typename T> static
-// LockFreeQueue<T>* createQueue(int key, size_t size = 16) {
-// LockFreeQueue<T> *queue = _createQueue<T>(key, size);
-// queue->reference++;
-// LoggerFactory::getLogger().debug("createQueue reference===%d", queue->reference.load());
-// return queue;
-// }
-
-// /**
-// * destroy queue
-// */
-// template <typename T> static
-// void dropQueue(int key) {
-// LockFreeQueue<T> *queue = _createQueue<T> (key);
-// if(queue == NULL)
-// return;
-
-// queue->reference--;
-// LoggerFactory::getLogger().debug("dropQueue reference===%d", queue->reference.load());
-// if(queue->reference == 0) {
-// delete queue;
-// hashtable_t *hashtable = getHashTable();
-// hashtable_remove(hashtable, key);
-// }
-
-// }
-
-// };
-// #endif
diff --git a/queue/include/shm_queue_wrapper.h b/queue/include/shm_queue_wrapper.h
index ff918b6..1ceac9d 100644
--- a/queue/include/shm_queue_wrapper.h
+++ b/queue/include/shm_queue_wrapper.h
@@ -10,16 +10,7 @@
extern "C" {
#endif
-#define MAX_ELE_SIZE 512
-
-typedef struct ele_t {
- char buf[MAX_ELE_SIZE];
-} ele_t;
-
-typedef struct shmqueue_t {
- size_t ele_size;
- void *mqueue;
-} shmqueue_t;
+
/**
* 鍒濆鍖�
@@ -28,114 +19,54 @@
* @ queue_size 闃熷垪澶у皬
* @ ele_size 闃熷垪涓厓绱犲ぇ灏�
*/
-inline void shmqueue_init(shmqueue_t *shmqueue, int key, int queue_size, int ele_size) {
- if(ele_size > MAX_ELE_SIZE) {
- err_exit(0, "shmqueue_init 鍏冪礌澶у皬瓒呰繃璁捐鐨勬渶澶уぇ灏�");
- }
- SHMQueue<ele_t> *queue = new SHMQueue<ele_t>(key, queue_size);
- shmqueue->mqueue = (void *)queue;
- shmqueue->ele_size = ele_size;
-}
-
-
-
+void* shmqueue_init(int key, int queue_size, int ele_size);
/**
* 閿�姣�
*/
-inline void shmqueue_destroy(shmqueue_t *shmqueue) {
- delete (SHMQueue<ele_t> *)shmqueue->mqueue;
-}
-
+void shmqueue_destroy(void *shmqueue);
/**
* 闃熷垪鍏冪礌鐨勪釜鏁�
*/
-inline uint32_t shmqueue_size(shmqueue_t *shmqueue) {
- return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->size();
-}
-
+uint32_t shmqueue_size(void *shmqueue);
/**
* 鏄惁宸叉弧
*/
-inline int shmqueue_full(shmqueue_t *shmqueue) {
- return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->full();
-}
+int shmqueue_full(void *shmqueue);
/**
* 鏄惁涓虹┖
*/
-inline int shmqueue_empty(shmqueue_t *shmqueue) {
- return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->empty();
-}
+int shmqueue_empty(void *shmqueue);
/**
* 鍏ラ槦, 闃熷垪婊℃椂绛夊緟
*/
-inline int shmqueue_push(shmqueue_t *shmqueue, void *src_ele) {
- ele_t dest_ele;
- memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
- return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push(dest_ele);
-}
+int shmqueue_push(void *shmqueue, void *src_ele);
/**
* 鍏ラ槦, 闃熷垪婊℃椂绔嬪嵆杩斿洖
*/
-inline int shmqueue_push_nowait(shmqueue_t *shmqueue, void *src_ele) {
- ele_t dest_ele;
- memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
- return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_nowait(dest_ele);
-}
+int shmqueue_push_nowait(void *shmqueue, void *src_ele);
/**
- * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆瀵逛笉鎴愬姛灏辫繑鍥�
+ * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆闃熶笉鎴愬姛灏辫繑鍥�
*/
-inline int shmqueue_push_timeout(shmqueue_t *shmqueue, void *src_ele, struct timespec * timeout) {
- ele_t dest_ele;
- memcpy(&dest_ele.buf, src_ele, shmqueue->ele_size);
- return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->push_timeout(dest_ele, timeout);
-}
+int shmqueue_push_timeout(void *shmqueue, void *src_ele, struct timespec * timeout);
/**
* 鍑洪槦, 闃熷垪绌烘椂绛夊緟
*/
-inline int shmqueue_pop(shmqueue_t *shmqueue, void *dest_ele) {
- ele_t src_ele;
- bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src_ele);
- if (rv) {
- memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
- return 1;
- } else {
- return 0;
- }
-
-}
+int shmqueue_pop(void *shmqueue, void *dest_ele);
/**
* 鍑洪槦, 闃熷垪绌烘椂绔嬪嵆杩斿洖
*/
-inline int shmqueue_pop_nowait(shmqueue_t *shmqueue, void *dest_ele) {
- ele_t src_ele;
- bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src_ele);
- if (rv) {
- memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
- return 1;
- } else {
- return 0;
- }
-}
+int shmqueue_pop_nowait(void *shmqueue, void *dest_ele);
/**
- * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭瀵逛笉鎴愬姛灏辫繑鍥�
+ * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭闃熶笉鎴愬姛灏辫繑鍥�
*/
-inline int shmqueue_pop_timeout(shmqueue_t *shmqueue, void *dest_ele, struct timespec * timeout) {
- ele_t src_ele;
- bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_timeout(src_ele, timeout);
- if (rv) {
- memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
- return 1;
- } else {
- return 0;
- }
-}
+int shmqueue_pop_timeout(void *shmqueue, void *dest_ele, struct timespec * timeout);
diff --git a/queue/libshm_queue.a b/queue/libshm_queue.a
index bb19a8f..bcdcdd0 100644
--- a/queue/libshm_queue.a
+++ b/queue/libshm_queue.a
Binary files differ
diff --git a/queue/shm_queue_wrapper.c b/queue/shm_queue_wrapper.c
new file mode 100644
index 0000000..daa3f1e
--- /dev/null
+++ b/queue/shm_queue_wrapper.c
@@ -0,0 +1,138 @@
+#include "shm_queue_wrapper.h"
+#define MAX_ELE_SIZE 512
+
+typedef struct ele_t {
+ char buf[MAX_ELE_SIZE];
+} ele_t;
+
+typedef struct shmqueue_t {
+ size_t ele_size;
+ void *mqueue;
+} shmqueue_t;
+
+/**
+ * 鍒濆鍖�
+ * @ shmqueue
+ * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�key
+ * @ queue_size 闃熷垪澶у皬
+ * @ ele_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");
+ }
+ shmqueue_t *shmqueue = (shmqueue_t*)malloc(sizeof(shmqueue_t));
+ SHMQueue<ele_t> *queue = new SHMQueue<ele_t>(key, queue_size);
+ shmqueue->mqueue = (void *)queue;
+ shmqueue->ele_size = ele_size;
+ return (void *)shmqueue;
+}
+
+/**
+ * 閿�姣�
+*/
+void shmqueue_destroy(void * _shmqueue) {
+ shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
+ delete (SHMQueue<ele_t> *)shmqueue->mqueue;
+ delete _shmqueue;
+}
+
+/**
+ * 闃熷垪鍏冪礌鐨勪釜鏁�
+ */
+uint32_t shmqueue_size(void * _shmqueue) {
+ shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
+ return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->size();
+}
+
+/**
+ * 鏄惁宸叉弧
+ */
+int shmqueue_full(void * _shmqueue) {
+ shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
+ return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->full();
+}
+
+/**
+ * 鏄惁涓虹┖
+ */
+int shmqueue_empty(void * _shmqueue) {
+ shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
+ return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->empty();
+}
+
+/**
+ * 鍏ラ槦, 闃熷垪婊℃椂绛夊緟
+ */
+int shmqueue_push(void * _shmqueue, void *src_ele) {
+ 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);
+}
+
+/**
+ * 鍏ラ槦, 闃熷垪婊℃椂绔嬪嵆杩斿洖
+ */
+int shmqueue_push_nowait(void * _shmqueue, void *src_ele) {
+ 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);
+}
+
+/**
+ * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆闃熶笉鎴愬姛灏辫繑鍥�
+ */
+int shmqueue_push_timeout(void * _shmqueue, void *src_ele, 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);
+}
+
+/**
+ * 鍑洪槦, 闃熷垪绌烘椂绛夊緟
+ */
+int shmqueue_pop(void * _shmqueue, void *dest_ele) {
+ shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
+ ele_t src_ele;
+ bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop(src_ele);
+ if (rv) {
+ memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+
+/**
+ * 鍑洪槦, 闃熷垪绌烘椂绔嬪嵆杩斿洖
+ */
+int shmqueue_pop_nowait(void * _shmqueue, void *dest_ele) {
+ shmqueue_t * shmqueue = (shmqueue_t *)_shmqueue;
+ ele_t src_ele;
+ bool rv = ((SHMQueue<ele_t> *)(shmqueue->mqueue))->pop_nowait(src_ele);
+ if (rv) {
+ memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/**
+ * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭闃熶笉鎴愬姛灏辫繑鍥�
+ */
+int shmqueue_pop_timeout(void * _shmqueue, void *dest_ele, 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);
+ if (rv) {
+ memcpy(dest_ele, &src_ele.buf, shmqueue->ele_size);
+ return 1;
+ } else {
+ return 0;
+ }
+}
diff --git a/test/Makefile b/test/Makefile
index 00aeefc..5981739 100755
--- a/test/Makefile
+++ b/test/Makefile
@@ -14,7 +14,7 @@
include $(ROOT)/Make.defines.$(PLATFORM)
-PROGS = test_queue single_productor single_consumer multiple_queue_productor multiple_queue_consumer test_timeout test_queue_wrapper
+PROGS = test_queue single_productor single_consumer multiple_queue_productor multiple_queue_consumer test_timeout
build: $(PROGS)
diff --git a/test2/test_queue_wrapper b/test2/test_queue_wrapper
index 141be3f..d79dc5f 100755
--- a/test2/test_queue_wrapper
+++ b/test2/test_queue_wrapper
Binary files differ
diff --git a/test2/test_queue_wrapper.c b/test2/test_queue_wrapper.c
index ae242a4..a5020a7 100644
--- a/test2/test_queue_wrapper.c
+++ b/test2/test_queue_wrapper.c
@@ -13,14 +13,13 @@
int key = 2;
size_t qsize = 16;
- shmqueue_t queue;
- shmqueue_init(&queue, key, qsize, sizeof(message_t));
+ void * queue = shmqueue_init( key, qsize, sizeof(message_t));
message_t item;
// LockFreeQueue<struct Item> queue(16);
for(i = 0; i < qsize; i++) {
sprintf(item.method, "hello");
item.code = i ;
- if(shmqueue_push(&queue, (void *)&item)) {
+ if(shmqueue_push(queue, (void *)&item)) {
printf("push:%d %s\n", item.code, item.method );
}
}
@@ -28,14 +27,14 @@
struct timespec timeout = {1, 0};
i = 0;
- while((shmqueue_pop_timeout(&queue, (void *)&item, &timeout)) ) {
+ while((shmqueue_pop_timeout(queue, (void *)&item, &timeout)) ) {
printf("pop:%d %s\n", item.code, item.method );
// cout << item.pic << endl;
i++;
}
//閿�姣侀槦鍒�
- shmqueue_destroy(&queue);
+ shmqueue_destroy(queue);
}
--
Gitblit v1.8.0