From e4ce347428a0d459c7561f7bb3e180f351c11a4f Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 14 七月 2020 10:38:18 +0800
Subject: [PATCH] update

---
 queue/include/array_lock_free_queue.h |    5 +
 queue/libshm_queue.a                  |    0 
 test2/test_queue_wrapper              |    0 
 test2/client.c                        |    4 
 test2/sem_test.c                      |   21 +++++++
 test2/server                          |    0 
 test/test_timeout                     |    0 
 queue/include/shm_queue_wrapper.h     |   15 ++++
 test/multiple_queue_consumer          |    0 
 test2/Makefile                        |    2 
 test/multiple_queue_productor         |    0 
 test2/sem_test                        |    0 
 /dev/null                             |   46 ---------------
 test/test_queue                       |    0 
 queue/include/mem_pool.h              |   51 +++++++++++++++--
 queue/include/mm.h                    |    2 
 test2/client                          |    0 
 queue/mm.c                            |    5 +
 test/test_lostdata                    |    0 
 test/single_consumer                  |    0 
 test/single_productor                 |    0 
 queue/shm_queue_wrapper.c             |   20 +++++-
 test2/server.c                        |    4 
 23 files changed, 107 insertions(+), 68 deletions(-)

diff --git a/queue/include/array_lock_free_queue.h b/queue/include/array_lock_free_queue.h
index 90c3bf1..056f53b 100644
--- a/queue/include/array_lock_free_queue.h
+++ b/queue/include/array_lock_free_queue.h
@@ -4,6 +4,7 @@
 #include <assert.h> // assert()
 #include <sched.h>  // sched_yield()
 #include "logger_factory.h"
+#include "mem_pool.h"
 
 /// @brief implementation of an array based lock free queue with support for 
 ///        multiple producers
@@ -90,7 +91,7 @@
     ,m_count(0)           //
 #endif
 {
-    m_theQueue = (ELEM_T*)mm_malloc(Q_SIZE * sizeof(ELEM_T));
+    m_theQueue = (ELEM_T*)mem_pool_malloc(Q_SIZE * sizeof(ELEM_T));
 
 }
 
@@ -98,7 +99,7 @@
 ArrayLockFreeQueue<ELEM_T>::~ArrayLockFreeQueue()
 {
     // std::cout << "destroy ArrayLockFreeQueue\n";
-    mm_free(m_theQueue);
+    mem_pool_free(m_theQueue);
     
 }
 
diff --git a/queue/include/mem_pool.h b/queue/include/mem_pool.h
index 045e972..17a7c5c 100644
--- a/queue/include/mem_pool.h
+++ b/queue/include/mem_pool.h
@@ -1,15 +1,54 @@
 #ifndef _MEM_POOL_H_
 #define _MEM_POOL_H_  
 #include "mm.h"
+#include "sem_util.h"
+#define MEM_POOL_COND_KEY 0x8801
 
+static int mem_pool_cond  = SemUtil::get(MEM_POOL_COND_KEY, 0);
 
-extern void mem_pool_init(size_t heap_size);
-extern void mem_pool_destroy(void);
+// static int mem_pool_mutex  = SemUtil::get(MEM_POOL_COND_KEY, 1);
 
-extern void *mem_pool_malloc (size_t size);
-extern void mem_pool_free (void *ptr);
-extern void *mem_pool_realloc(void *ptr, size_t size);
-extern hashtable_t * mem_pool_get_hashtable();
+static inline void mem_pool_init(size_t heap_size) {
+	if(mm_init(heap_size)) {
+		 
+	}
+}
+
+static inline void mem_pool_destroy(void) {
+	if(mm_destroy()) {
+		SemUtil::remove(mem_pool_cond);
+	}
+	
+}
+
+static inline void *mem_pool_malloc (size_t size) {
+	void *ptr;
+	while( (ptr = mm_malloc(size)) == NULL ) {
+		err_msg(0, "There is not enough memery to allocate, waiting someone else to free.");
+		SemUtil::set(mem_pool_cond, 0);
+		// wait for someone else to free space
+		SemUtil::dec(mem_pool_cond);
+
+	}
+	
+	return ptr;
+}
+
+static inline void mem_pool_free (void *ptr) {
+	mm_free(ptr);
+	// notify malloc
+	SemUtil::set(mem_pool_cond, 1);
+
+}
+
+static inline void *mem_pool_realloc (void *ptr, size_t size) {
+	return mm_realloc(ptr, size);
+}
+
+static inline hashtable_t * mem_pool_get_hashtable() {
+	return mm_get_hashtable();
+
+}
 // extern int mm_checkheap(int verbose);
 
 
diff --git a/queue/include/mm.h b/queue/include/mm.h
index 0484532..f0ab764 100644
--- a/queue/include/mm.h
+++ b/queue/include/mm.h
@@ -6,7 +6,7 @@
 #include "hashtable.h"
 
 extern bool mm_init(size_t heap_size);
-extern void mm_destroy(void);
+extern bool mm_destroy(void);
 
 extern void *mm_malloc (size_t size);
 extern void mm_free (void *ptr);
diff --git a/queue/include/shm_queue_wrapper.h b/queue/include/shm_queue_wrapper.h
index fadc6ae..cdfb2e2 100644
--- a/queue/include/shm_queue_wrapper.h
+++ b/queue/include/shm_queue_wrapper.h
@@ -9,13 +9,24 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+/**
+ * 鍒濆鍖栧叡浜唴瀛�
+ * @size 鍏变韩鍐呭瓨澶у皬
+ * 
+ */
+void shm_init(int size);
+
+/**
+ * 閿�姣佸叡浜唴瀛�
+ * 鏁翠釜杩涚▼閫�鍑烘椂闇�瑕佹墽琛岃繖涓柟娉曪紝璇ユ柟娉曢鍏堜細妫�鏌ユ槸鍚﹁繕鏈夊叾浠栬繘绋嬪湪浣跨敤璇ュ叡浜唴瀛橈紝濡傛灉杩樻湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ氨鍙槸detach,濡傛灉娌℃湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ垯閿�姣佹暣鍧楀唴瀛樸��
+ */
+void shm_destroy();
 
 /**
  * 鍒涘缓闃熷垪
  * @ shmqueue 
- * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�key, 濡傛灉key涓虹┖浼氳嚜鍔ㄥ垎閰嶄竴涓猭ey锛屽鏋渒ey涓嶄細绌轰細妫�鏌ユ槸鍚︽湁閲嶅缁戝畾鐨勬儏鍐�, 鐒跺悗缁戝畾key.
+ * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�鏍囪瘑, key鏄竴涓寚閽堥噷闈㈠瓨鍌ㄤ簡key鐨勫�硷紝 濡傛灉key鐨勫�间负-1绯荤粺浼氳嚜鍔ㄥ垎閰嶄竴涓猭ey鍊煎苟鎶婅key鐨勫�艰祴缁檏ey鎸囬拡銆傚鏋渒ey鐨勫�间笉浼氱┖浼氭鏌ユ槸鍚︽湁閲嶅缁戝畾鐨勬儏鍐�, 鏈夐噸澶嶅氨鎶ラ敊娌℃湁灏卞垱寤洪槦鍒楀苟缁戝畾key.
  * @ queue_size 闃熷垪澶у皬
- * @ ele_size 闃熷垪涓厓绱犲ぇ灏�
  */
 void* shmqueue_create( int * key, int queue_size);
 
diff --git a/queue/libshm_queue.a b/queue/libshm_queue.a
index 9a5d402..834164e 100644
--- a/queue/libshm_queue.a
+++ b/queue/libshm_queue.a
Binary files differ
diff --git a/queue/mem_pool.c b/queue/mem_pool.c
deleted file mode 100644
index 225257c..0000000
--- a/queue/mem_pool.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "mem_pool.h"
-#include "sem_util.h"
-#define MEM_POOL_COND_KEY 0x8801
-
-static int mem_pool_cond  = SemUtil::get(MEM_POOL_COND_KEY, 0);
-
-// static int mem_pool_mutex  = SemUtil::get(MEM_POOL_COND_KEY, 1);
-
-void mem_pool_init(size_t heap_size) {
-	if(mm_init(heap_size)) {
-		 
-	}
-}
-
-void mem_pool_destroy(void) {
-	mm_destroy();
-}
-
-void *mem_pool_malloc (size_t size) {
-	void *ptr;
-	while( (ptr = mm_malloc(size)) == NULL ) {
-		err_msg(0, "There is not enough memery to allocate, waiting someone else to free.");
-		SemUtil::set(mem_pool_cond, 0);
-		// wait for someone else to free space
-		SemUtil::dec(mem_pool_cond);
-
-	}
-	
-	return ptr;
-}
-
-void mem_pool_free (void *ptr) {
-	mm_free(ptr);
-	// notify malloc
-	SemUtil::set(mem_pool_cond, 1);
-
-}
-
-void *mem_pool_realloc (void *ptr, size_t size) {
-	return mm_realloc(ptr, size);
-}
-
-hashtable_t * mem_pool_get_hashtable() {
-	return mm_get_hashtable();
-
-}
\ No newline at end of file
diff --git a/queue/mm.c b/queue/mm.c
index 2276a7f..592fda0 100644
--- a/queue/mm.c
+++ b/queue/mm.c
@@ -374,7 +374,7 @@
 
  
 
-void mm_destroy(void) {
+bool mm_destroy(void) {
   struct shmid_ds shmid_ds;
   //detache
   SemUtil::dec(mutex);
@@ -395,13 +395,16 @@
 
        SemUtil::inc(mutex);
        SemUtil::remove(mutex);
+       return true;
 
     } else {
       SemUtil::inc(mutex);
     }
+    return false;
   } else {
     err_msg(errno, "mm_destroy shmctl IPC_STAT");
     SemUtil::inc(mutex);
+    return false;
   }
  
   
diff --git a/queue/shm_queue_wrapper.c b/queue/shm_queue_wrapper.c
index 61a049e..cb30568 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,12 +12,20 @@
 	void *mqueue;
 } shmqueue_t;
 
+
+void shm_init(int size) {
+	mem_pool_init(size);
+}
+
+void shm_destroy() {
+	mem_pool_destroy();
+}
+
 /**
  * 鍒涘缓闃熷垪
  * @ shmqueue 
  * @ key 鏍囪瘑鍏变韩闃熷垪鐨勫敮涓�鏍囪瘑, key鏄竴涓寚閽堥噷闈㈠瓨鍌ㄤ簡key鐨勫�硷紝 濡傛灉key鐨勫�间负-1绯荤粺浼氳嚜鍔ㄥ垎閰嶄竴涓猭ey鍊煎苟鎶婅key鐨勫�艰祴缁檏ey鎸囬拡銆傚鏋渒ey鐨勫�间笉浼氱┖浼氭鏌ユ槸鍚︽湁閲嶅缁戝畾鐨勬儏鍐�, 鏈夐噸澶嶅氨鎶ラ敊娌℃湁灏卞垱寤洪槦鍒楀苟缁戝畾key.
  * @ queue_size 闃熷垪澶у皬
- * @ size 闃熷垪涓厓绱犲ぇ灏�
  */
 void* shmqueue_create( int * key, int queue_size) {
 	int  mkey;
@@ -28,7 +36,7 @@
 	} 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 +48,12 @@
 }
 
 /**
- * 缁戝畾key鍒伴槦鍒楋紝浣嗘槸骞朵笉浼氬垱寤洪槦鍒椼�傚鏋滄病鏈夊搴旀寚瀹歬ey鐨勯槦鍒楁彁绀洪敊璇苟杩斿洖绌哄��
+ * 缁戝畾key鍒伴槦鍒楋紝浣嗘槸骞朵笉浼氬垱寤洪槦鍒椼�傚鏋滄病鏈夊搴旀寚瀹歬ey鐨勯槦鍒楁彁绀洪敊璇苟閫�鍑�
  */
 void* shmqueue_attach(int key) {
 	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;
 	}
 
@@ -175,3 +183,5 @@
 		return 0;
 	}
 }
+
+
diff --git a/test/multiple_queue_consumer b/test/multiple_queue_consumer
index bfa3a9a..f61b254 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 38e9d9b..7c72ebd 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 56d9f86..2086547 100755
--- a/test/single_consumer
+++ b/test/single_consumer
Binary files differ
diff --git a/test/single_productor b/test/single_productor
index 793c2de..214555a 100755
--- a/test/single_productor
+++ b/test/single_productor
Binary files differ
diff --git a/test/test_lostdata b/test/test_lostdata
index a88dd0f..159b08c 100755
--- a/test/test_lostdata
+++ b/test/test_lostdata
Binary files differ
diff --git a/test/test_queue b/test/test_queue
index 48ce52b..2c19fc1 100755
--- a/test/test_queue
+++ b/test/test_queue
Binary files differ
diff --git a/test/test_timeout b/test/test_timeout
index 22d1bca..c4469a4 100755
--- a/test/test_timeout
+++ b/test/test_timeout
Binary files differ
diff --git a/test2/Makefile b/test2/Makefile
index 9743df5..be8415f 100644
--- a/test2/Makefile
+++ b/test2/Makefile
@@ -14,7 +14,7 @@
 include $(ROOT)/Make.defines.$(PLATFORM)
 
 
-PROGS =	test_queue_wrapper server client
+PROGS =	test_queue_wrapper server client sem_test
 
 
 build: $(PROGS)
diff --git a/test2/client b/test2/client
index d10c507..4a1aa39 100755
--- a/test2/client
+++ b/test2/client
Binary files differ
diff --git a/test2/client.c b/test2/client.c
index 09b0ceb..fd511d5 100644
--- a/test2/client.c
+++ b/test2/client.c
@@ -37,10 +37,10 @@
 
  
 int main () {
-	mm_init(512);
+	shm_init(512);
 	client();
 
 	//鏁翠釜杩涚▼閫�鍑烘椂闇�瑕佹墽琛岃繖涓柟娉曪紝璇ユ柟娉曢鍏堜細妫�鏌ユ槸鍚﹁繕鏈夊叾浠栬繘绋嬪湪浣跨敤璇ュ叡浜唴瀛橈紝濡傛灉杩樻湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ氨鍙槸detach,濡傛灉娌℃湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ垯閿�姣佹暣鍧楀唴瀛樸��
-	mm_destroy();
+	shm_destroy();
 	return 0;
 }
\ No newline at end of file
diff --git a/test2/sem_test b/test2/sem_test
new file mode 100755
index 0000000..26796de
--- /dev/null
+++ b/test2/sem_test
Binary files differ
diff --git a/test2/sem_test.c b/test2/sem_test.c
new file mode 100644
index 0000000..8cfa626
--- /dev/null
+++ b/test2/sem_test.c
@@ -0,0 +1,21 @@
+#include "usg_common.h"
+#include "sem_util.h"
+static int mem_pool_cond  = SemUtil::get(0x2001, 0);
+
+void *run(void *varg) {
+	sleep(5);
+	// notify malloc
+	SemUtil::set(mem_pool_cond, 1);
+}
+
+int main() {
+
+  pthread_t tid;
+  pthread_create(&tid, NULL, run, NULL); 
+  SemUtil::set(mem_pool_cond, 0);
+  // wait for someone else to free space
+  printf("waiting...\n");
+  SemUtil::dec(mem_pool_cond);
+  printf("weak...\n");
+
+}
\ No newline at end of file
diff --git a/test2/server b/test2/server
index 14395d5..f48ed6c 100755
--- a/test2/server
+++ b/test2/server
Binary files differ
diff --git a/test2/server.c b/test2/server.c
index 0f8b446..2cf97a1 100644
--- a/test2/server.c
+++ b/test2/server.c
@@ -34,10 +34,10 @@
 
  
 int main () {
-	mm_init(512);
+	shm_init(512);
 	server();
 
 	//鏁翠釜杩涚▼閫�鍑烘椂闇�瑕佹墽琛岃繖涓柟娉曪紝璇ユ柟娉曢鍏堜細妫�鏌ユ槸鍚﹁繕鏈夊叾浠栬繘绋嬪湪浣跨敤璇ュ叡浜唴瀛橈紝濡傛灉杩樻湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ氨鍙槸detach,濡傛灉娌℃湁鍏朵粬杩涚▼鍦ㄤ娇鐢ㄥ垯閿�姣佹暣鍧楀唴瀛樸��
-	mm_destroy();
+	shm_destroy();
 	return 0;
 }
\ No newline at end of file
diff --git a/test2/test_queue_wrapper b/test2/test_queue_wrapper
index 7740c7d..e6d73d9 100755
--- a/test2/test_queue_wrapper
+++ b/test2/test_queue_wrapper
Binary files differ

--
Gitblit v1.8.0