From 91f003aac4c95f4d2a2fc0782c9bea9d484b6919 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 09 七月 2020 14:48:07 +0800
Subject: [PATCH] update

---
 queue/include/array_lock_free_queue.h  |   10 
 queue/include/shm_queue.h              |   26 --
 .gitignore                             |    3 
 Makefile                               |    2 
 test/test_timeout                      |    0 
 queue/logger_factory.h                 |    0 
 test2/test_queue_wrapper.c             |   48 +++++
 queue/include/shm_queue_wrapper.h      |  146 ++++++++++++++++
 test2/Makefile                         |   32 +++
 queue/include/linked_lock_free_queue.h |    0 
 test/test_queue.c                      |   36 +++
 test/test_queue                        |    0 
 queue/include/shm_allocator.h          |    0 
 queue/libshm_queue.a                   |    0 
 test2/test_queue_wrapper               |    0 
 test/test                              |    0 
 test/multiple_queue_consumer           |    0 
 test/multiple_queue_productor          |    0 
 README.md                              |  131 ++++++++++++++
 queue/hashtable.c                      |    0 
 queue/sem_util.c                       |    0 
 queue/Makefile                         |    4 
 test/Makefile                          |   18 +-
 queue/sem_util.h                       |    0 
 queue/mm.c                             |    0 
 test/single_consumer                   |    0 
 test/test.c                            |   35 +++
 test/single_productor                  |    0 
 queue/hashtable.h                      |    0 
 queue/include/queue_factory.h          |    0 
 queue/mm.h                             |    0 
 queue/include/lock_free_queue.h        |    0 
 32 files changed, 446 insertions(+), 45 deletions(-)

diff --git a/.gitignore b/.gitignore
index d37cf8e..f2d51ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,7 +12,6 @@
 *.pch
 
 # Compiled Dynamic libraries
-*.so
 *.dylib
 *.dll
 
@@ -23,8 +22,6 @@
 # Compiled Static libraries
 *.lai
 *.la
-*.a
-*.lib
 
 # Executables
 *.exe
diff --git a/Makefile b/Makefile
index 6a36d7b..a40c84c 100755
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-DIRS = squeue test
+DIRS = queue  test
 
 all:
 	for i in $(DIRS); do \
diff --git a/README.md b/README.md
index 891e42f..29dd32a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,131 @@
-## cppShmqueue
+## 瀹炰緥
 
-Cpp鐗堟湰鐨勫叡浜唴瀛橀槦鍒楀簱
+```
+#include "shm_queue_wrapper.h"
+#include "mm.h"
+
+typedef struct message_t
+{
+	char method[20];
+	int code;
+	
+} message_t;
+
+void test1() {
+	unsigned int i = 0;
+	int key = 2;
+ 
+	size_t qsize = 16;
+  	shmqueue_t queue;
+	shmqueue_init(&queue, 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)) {
+			  printf("push:%d %s\n", item.code, item.method );
+		}
+	}
+	 
+	struct timespec timeout = {1, 0};
+
+	i = 0;
+	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);
+}
+
+ 
+int main () {
+	test1();
+
+	//鏁翠釜杩涚▼閫�鍑烘椂闇�瑕佹墽琛岃繖涓柟娉曪紝璇ユ柟娉曢鍏堜細妫�鏌ユ槸鍚﹁繕鏈夊叾浠栬繘绋嬪湪浣跨敤璇ュ叡浜唴瀛橈紝濡傛灉杩樻湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ氨鍙槸detach,濡傛灉娌℃湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄩ攢姣佹暣鍧楀唴瀛樸��
+	mm_destroy();
+	return 0;
+}
+```
+## 鎺ュ彛璇存槑
+
+```
+
+/**
+ * 鍒濆鍖�
+ * @ shmqueue 
+ * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�key
+ * @ 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;
+}
+
+
+
+/**
+ * 閿�姣�
+*/
+inline void shmqueue_destroy(shmqueue_t *shmqueue) {
+	delete (SHMQueue<ele_t> *)shmqueue->mqueue;
+}
+
+/**
+ * 闃熷垪鍏冪礌鐨勪釜鏁�
+ */
+inline uint32_t shmqueue_size(shmqueue_t *shmqueue) {
+	return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->size();
+}
+
+/**
+ * 鏄惁宸叉弧
+ */
+inline int shmqueue_full(shmqueue_t *shmqueue) {
+	return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->full();
+}
+
+/**
+ * 鏄惁涓虹┖
+ */
+inline int shmqueue_empty(shmqueue_t *shmqueue) {
+	return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->empty();
+}
+
+/**
+ * 鍏ラ槦, 闃熷垪婊℃椂绛夊緟
+ */
+inline int shmqueue_push(shmqueue_t *shmqueue, void *src_ele) 
+
+/**
+ * 鍏ラ槦, 闃熷垪婊℃椂绔嬪嵆杩斿洖
+ */
+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) 
+/**
+ * 鍑洪槦, 闃熷垪绌烘椂绛夊緟
+ */
+inline int shmqueue_pop(shmqueue_t *shmqueue, void *dest_ele)  
+
+/**
+ * 鍑洪槦, 闃熷垪绌烘椂绔嬪嵆杩斿洖
+ */
+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/squeue/Makefile b/queue/Makefile
similarity index 94%
rename from squeue/Makefile
rename to queue/Makefile
index 8333f37..c18e39a 100644
--- a/squeue/Makefile
+++ b/queue/Makefile
@@ -14,8 +14,8 @@
 PLATFORM=$(shell $(ROOT)/systype.sh)
 include $(ROOT)/Make.defines.$(PLATFORM)
 
-LIBSQUEUE = libsqueue.a
-DLIBSQUEUE = libsqueue.so
+LIBSQUEUE = libshm_queue.a
+DLIBSQUEUE = libshm_queue.so
 
 SOURCES := $(wildcard *.c)
 OBJS   = $(patsubst %.c, %.o, $(SOURCES)) 
diff --git a/squeue/hashtable.c b/queue/hashtable.c
similarity index 100%
rename from squeue/hashtable.c
rename to queue/hashtable.c
diff --git a/squeue/hashtable.h b/queue/hashtable.h
similarity index 100%
rename from squeue/hashtable.h
rename to queue/hashtable.h
diff --git a/squeue/include/array_lock_free_queue.h b/queue/include/array_lock_free_queue.h
similarity index 95%
rename from squeue/include/array_lock_free_queue.h
rename to queue/include/array_lock_free_queue.h
index e03d6cd..931e839 100644
--- a/squeue/include/array_lock_free_queue.h
+++ b/queue/include/array_lock_free_queue.h
@@ -222,7 +222,9 @@
                 currentWriteIndex, (currentWriteIndex + 1)));
     
     // Just made sure this index is reserved for this thread.
-    m_theQueue[countToIndex(currentWriteIndex)] = a_data;
+   // m_theQueue[countToIndex(currentWriteIndex)] = a_data;
+    // printf("===sizeof(ELEM_T) = %d\n", sizeof(ELEM_T));
+    memcpy((void *)(&m_theQueue[countToIndex(currentWriteIndex)]), (void *)(&a_data), sizeof(ELEM_T) );
     
     // update the maximum read index after saving the piece of data. It can't
     // fail if there is only one thread inserting in the queue. It might fail 
@@ -240,7 +242,7 @@
         // software threads than hardware processors and you have more
         // than 1 producer thread
         // have a look at sched_yield (POSIX.1b)
-        //sched_yield();
+        sched_yield();
     }
 
     // The value was successfully inserted into the queue
@@ -278,8 +280,8 @@
     #endif
 
         // retrieve the data from the queue
-        a_data = m_theQueue[countToIndex(currentReadIndex)];
-
+        //a_data = m_theQueue[countToIndex(currentReadIndex)];
+        memcpy((void*) (&a_data), (void *)(&m_theQueue[countToIndex(currentReadIndex)]),sizeof(ELEM_T) );
         // try to perfrom now the CAS operation on the read index. If we succeed
         // a_data already contains what m_readIndex pointed to before we 
         // increased it
diff --git a/squeue/include/linked_lock_free_queue.h b/queue/include/linked_lock_free_queue.h
similarity index 100%
rename from squeue/include/linked_lock_free_queue.h
rename to queue/include/linked_lock_free_queue.h
diff --git a/squeue/include/lock_free_queue.h b/queue/include/lock_free_queue.h
similarity index 100%
rename from squeue/include/lock_free_queue.h
rename to queue/include/lock_free_queue.h
diff --git a/squeue/include/queue_factory.h b/queue/include/queue_factory.h
similarity index 100%
rename from squeue/include/queue_factory.h
rename to queue/include/queue_factory.h
diff --git a/squeue/include/shm_allocator.h b/queue/include/shm_allocator.h
similarity index 100%
rename from squeue/include/shm_allocator.h
rename to queue/include/shm_allocator.h
diff --git a/squeue/include/shm_queue.h b/queue/include/shm_queue.h
similarity index 79%
rename from squeue/include/shm_queue.h
rename to queue/include/shm_queue.h
index 0bcc3db..70cd9cc 100644
--- a/squeue/include/shm_queue.h
+++ b/queue/include/shm_queue.h
@@ -9,9 +9,6 @@
 
 // default Queue size
 // #define LOCK_FREE_Q_DEFAULT_SIZE 16
-
-//  
-
  
 template < typename ELEM_T>
 class SHMQueue
@@ -37,35 +34,18 @@
     /// @brief constructor of the class
     SHMQueue(int key=0, size_t qsize = LOCK_FREE_Q_DEFAULT_SIZE);
     
-    /// @brief destructor of the class. 
-    /// Note it is not virtual since it is not expected to inherit from this
-    /// template
+    
     ~SHMQueue();
 
-    /// @brief returns the current number of items in the queue
-    /// It tries to take a snapshot of the size of the queue, but in busy environments
-    /// this function might return bogus values. 
-    ///
-    /// If a reliable queue size must be kept you might want to have a look at 
-    /// the preprocessor variable in this header file called '_WITH_LOCK_FREE_Q_KEEP_REAL_SIZE'
-    /// it enables a reliable size though it hits overall performance of the queue 
-    /// (when the reliable size variable is on it's got an impact of about 20% in time)
+   
     inline uint32_t size();
-    
-    /// @brief return true if the queue is full. False otherwise
-    /// It tries to take a snapshot of the size of the queue, but in busy 
-    /// environments this function might return bogus values. See help in method
-    /// SHMQueue::size
+ 
     inline bool full();
-
     inline bool empty();
-
    
     inline bool push(const ELEM_T &a_data);
     inline bool push_nowait(const ELEM_T &a_data);
     inline bool push_timeout(const ELEM_T &a_data, struct timespec * timeout);
-
-  
     inline bool pop(ELEM_T &a_data);
     inline bool pop_nowait(ELEM_T &a_data);
     inline bool pop_timeout(ELEM_T &a_data, struct timespec * timeout);
diff --git a/queue/include/shm_queue_wrapper.h b/queue/include/shm_queue_wrapper.h
new file mode 100644
index 0000000..ff918b6
--- /dev/null
+++ b/queue/include/shm_queue_wrapper.h
@@ -0,0 +1,146 @@
+#ifndef __SHM_QUEUE_WRAPPER_H__
+#define __SHM_QUEUE_WRAPPER_H__
+
+#include "usg_common.h"
+#include "usg_typedef.h"
+#include "shm_queue.h"
+#include "shm_allocator.h"
+
+#ifdef __cplusplus
+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;
+
+/**
+ * 鍒濆鍖�
+ * @ shmqueue 
+ * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�key
+ * @ 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;
+}
+
+
+
+/**
+ * 閿�姣�
+*/
+inline void shmqueue_destroy(shmqueue_t *shmqueue) {
+	delete (SHMQueue<ele_t> *)shmqueue->mqueue;
+}
+
+/**
+ * 闃熷垪鍏冪礌鐨勪釜鏁�
+ */
+inline uint32_t shmqueue_size(shmqueue_t *shmqueue) {
+	return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->size();
+}
+
+/**
+ * 鏄惁宸叉弧
+ */
+inline int shmqueue_full(shmqueue_t *shmqueue) {
+	return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->full();
+}
+
+/**
+ * 鏄惁涓虹┖
+ */
+inline int shmqueue_empty(shmqueue_t *shmqueue) {
+	return ((SHMQueue<ele_t> *)(shmqueue->mqueue))->empty();
+}
+
+/**
+ * 鍏ラ槦, 闃熷垪婊℃椂绛夊緟
+ */
+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);
+}
+
+/**
+ * 鍏ラ槦, 闃熷垪婊℃椂绔嬪嵆杩斿洖
+ */
+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);
+}
+
+/**
+ * 鍏ラ槦, 鎸囧畾鏃堕棿鍐呭叆瀵逛笉鎴愬姛灏辫繑鍥�
+ */
+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);
+}
+
+/**
+ * 鍑洪槦, 闃熷垪绌烘椂绛夊緟
+ */
+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;
+	}
+
+}
+
+/**
+ * 鍑洪槦, 闃熷垪绌烘椂绔嬪嵆杩斿洖
+ */
+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;
+	}
+}
+
+/**
+ * 鍑洪槦, 鎸囧畾鏃堕棿鍐呭嚭瀵逛笉鎴愬姛灏辫繑鍥�
+ */
+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;
+	}
+}
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/queue/libshm_queue.a b/queue/libshm_queue.a
new file mode 100644
index 0000000..bb19a8f
--- /dev/null
+++ b/queue/libshm_queue.a
Binary files differ
diff --git a/squeue/logger_factory.h b/queue/logger_factory.h
similarity index 100%
rename from squeue/logger_factory.h
rename to queue/logger_factory.h
diff --git a/squeue/mm.c b/queue/mm.c
similarity index 100%
rename from squeue/mm.c
rename to queue/mm.c
diff --git a/squeue/mm.h b/queue/mm.h
similarity index 100%
rename from squeue/mm.h
rename to queue/mm.h
diff --git a/squeue/sem_util.c b/queue/sem_util.c
similarity index 100%
rename from squeue/sem_util.c
rename to queue/sem_util.c
diff --git a/squeue/sem_util.h b/queue/sem_util.h
similarity index 100%
rename from squeue/sem_util.h
rename to queue/sem_util.h
diff --git a/test/Makefile b/test/Makefile
index fdcff9a..00aeefc 100755
--- a/test/Makefile
+++ b/test/Makefile
@@ -4,17 +4,17 @@
 ROOT=..
 #LDLIBS+=-Wl,-rpath=$(ROOT)/common:$(ROOT)/lib/jsoncpp
 # 寮�婧愬伐鍏峰寘璺緞
-LDDIR += -L$(ROOT)/squeue
+LDDIR += -L$(ROOT)/queue
 # 寮�婧愬伐鍏峰寘
-LDLIBS += -lsqueue -lpthread
+LDLIBS += -lshm_queue -lpthread
 
-INCLUDE += -I$(ROOT)/squeue/ -I$(ROOT)/squeue/include
+INCLUDE += -I$(ROOT)/queue/ -I$(ROOT)/queue/include
 
 PLATFORM=$(shell $(ROOT)/systype.sh)
 include $(ROOT)/Make.defines.$(PLATFORM)
 
  
-PROGS =	test_queue single_productor single_consumer multiple_queue_productor multiple_queue_consumer test_timeout
+PROGS =	test_queue single_productor single_consumer multiple_queue_productor multiple_queue_consumer test_timeout test_queue_wrapper
 
 
 build: $(PROGS)
@@ -24,16 +24,16 @@
 # 濡傛灉鍖匒 寮曠敤鍖匓锛� B 瑕佹斁鍦� A 鍚庨潰
  
 
-test_queue: test.h  $(ROOT)/squeue/include/lock_free_queue.h
+test_queue: test.h  $(ROOT)/queue/include/lock_free_queue.h
 
-single_productor: test.h  $(ROOT)/squeue/include/lock_free_queue.h
+single_productor: test.h  $(ROOT)/queue/include/lock_free_queue.h
 
-single_consumer: test.h  $(ROOT)/squeue/include/lock_free_queue.h
+single_consumer: test.h  $(ROOT)/queue/include/lock_free_queue.h
 
 clean:
 	rm -f $(TEMPFILES) $(PROGS)
 
 
 
-$(LIBSQUEUE):
-	(cd $(ROOT)/squeue && $(MAKE))
+$(LIBQUEUE):
+	(cd $(ROOT)/queue && $(MAKE))
diff --git a/test/multiple_queue_consumer b/test/multiple_queue_consumer
index ac28596..1724036 100755
--- a/test/multiple_queue_consumer
+++ b/test/multiple_queue_consumer
Binary files differ
diff --git a/test/multiple_queue_productor b/test/multiple_queue_productor
index 9db7ae0..ffbdb91 100755
--- a/test/multiple_queue_productor
+++ b/test/multiple_queue_productor
Binary files differ
diff --git a/test/single_consumer b/test/single_consumer
index eb83102..926e299 100755
--- a/test/single_consumer
+++ b/test/single_consumer
Binary files differ
diff --git a/test/single_productor b/test/single_productor
index 7dcfc82..8caa7bb 100755
--- a/test/single_productor
+++ b/test/single_productor
Binary files differ
diff --git a/test/test b/test/test
new file mode 100755
index 0000000..5e82a18
--- /dev/null
+++ b/test/test
Binary files differ
diff --git a/test/test.c b/test/test.c
index e69de29..99e3289 100644
--- a/test/test.c
+++ b/test/test.c
@@ -0,0 +1,35 @@
+#include "test.h"
+#define MKEY 0x2222
+int testmatshm() {
+
+  int shmid = -1;
+  void *shmp;
+  shmid = shmget(MKEY, 1024, IPC_CREAT | IPC_EXCL | OBJ_PERMS);
+  if (shmid == -1 && errno == EEXIST) {
+    printf("first create\n");
+    shmid = shmget(MKEY, 0, 0);
+  }
+
+  if (shmid == -1)
+    err_exit(errno, "testmatshm shmget");
+
+  shmp = shmat(shmid, NULL, 0);
+}
+
+typedef struct buf_t { char buf[7]; } buf_t;
+
+void test(int size) {
+  char buf[size];
+  printf("size = %d\n", sizeof(buf));
+}
+
+char msg[10];
+int main() {
+  // testmatshm();
+  // testmatshm();
+
+  // sleep(60);
+
+  // printf("size = %d, msg = %d\n", sizeof(buf_t), sizeof(msg));
+  test(12);
+}
\ No newline at end of file
diff --git a/test/test_queue b/test/test_queue
index ca75da2..4a4735a 100755
--- a/test/test_queue
+++ b/test/test_queue
Binary files differ
diff --git a/test/test_queue.c b/test/test_queue.c
index cb6ade7..9b64ceb 100644
--- a/test/test_queue.c
+++ b/test/test_queue.c
@@ -84,8 +84,42 @@
 }
 
 
+// void testArr(unsigned size) {
+// 	unsigned int i = 0;
+// 	int key = 2;
+
+// 	char item[size];
+
+// 	size_t qsize = 16;
+//   	//LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (key, qsize);
+// 	SHMQueue<char[size]> *queue = new SHMQueue<char[size]>(key, 16);
+// 	// LockFreeQueue<struct Item> queue(16);
+// 	for(i = 0; i < qsize; i++) {
+// 		sprintf(item, "%d hello", i);
+// 		if(queue->push(item)) {
+// 			 cout << i << " push锛�" << item << endl;
+// 		}
+// 	}
+
+	 
+
+
+	 
+// 	struct timespec timeout = {1, 0};
+
+// 	i = 0;
+// 	while((queue->pop_timeout(item, &timeout)) ) {
+// 	    cout << i << " pop锛�" << item << endl;
+// 	   // cout <<  item.pic << endl;
+// 	    i++;
+// 	}
+
+// 	delete queue;
+// }
+
+
 int main () {
-	testString();
+	// testArr(12);
 
 
 	mm_destroy();
diff --git a/test/test_timeout b/test/test_timeout
index a72120f..32e3a16 100755
--- a/test/test_timeout
+++ b/test/test_timeout
Binary files differ
diff --git a/test2/Makefile b/test2/Makefile
new file mode 100644
index 0000000..072837c
--- /dev/null
+++ b/test2/Makefile
@@ -0,0 +1,32 @@
+#
+# Makefile for common library.
+#
+ROOT=..
+#LDLIBS+=-Wl,-rpath=$(ROOT)/common:$(ROOT)/lib/jsoncpp
+# 寮�婧愬伐鍏峰寘璺緞
+LDDIR += -L$(ROOT)/queue
+# 寮�婧愬伐鍏峰寘
+LDLIBS += -lshm_queue -lpthread
+
+INCLUDE += -I$(ROOT)/queue/ -I$(ROOT)/queue/include
+
+PLATFORM=$(shell $(ROOT)/systype.sh)
+include $(ROOT)/Make.defines.$(PLATFORM)
+
+ 
+PROGS =	test_queue_wrapper
+
+
+build: $(PROGS)
+
+# test1: $(LIBCOMMON)
+
+# 濡傛灉鍖匒 寮曠敤鍖匓锛� B 瑕佹斁鍦� A 鍚庨潰
+  
+clean:
+	rm -f $(TEMPFILES) $(PROGS)
+
+
+
+$(LIBQUEUE):
+	(cd $(ROOT)/queue && $(MAKE))
diff --git a/test2/test_queue_wrapper b/test2/test_queue_wrapper
new file mode 100755
index 0000000..141be3f
--- /dev/null
+++ b/test2/test_queue_wrapper
Binary files differ
diff --git a/test2/test_queue_wrapper.c b/test2/test_queue_wrapper.c
new file mode 100644
index 0000000..ae242a4
--- /dev/null
+++ b/test2/test_queue_wrapper.c
@@ -0,0 +1,48 @@
+#include "shm_queue_wrapper.h"
+#include "mm.h"
+
+typedef struct message_t
+{
+	char method[20];
+	int code;
+	
+} message_t;
+
+void test1() {
+	unsigned int i = 0;
+	int key = 2;
+ 
+	size_t qsize = 16;
+  	shmqueue_t queue;
+	shmqueue_init(&queue, 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)) {
+			  printf("push:%d %s\n", item.code, item.method );
+		}
+	}
+	 
+	struct timespec timeout = {1, 0};
+
+	i = 0;
+	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);
+}
+
+ 
+int main () {
+	test1();
+
+	//鏁翠釜杩涚▼閫�鍑烘椂闇�瑕佹墽琛岃繖涓柟娉曪紝璇ユ柟娉曢鍏堜細妫�鏌ユ槸鍚﹁繕鏈夊叾浠栬繘绋嬪湪浣跨敤璇ュ叡浜唴瀛橈紝濡傛灉杩樻湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ氨鍙槸detach,濡傛灉娌℃湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ垯閿�姣佹暣鍧楀唴瀛樸��
+	mm_destroy();
+	return 0;
+}
\ No newline at end of file

--
Gitblit v1.8.0