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