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/mem_pool.h |   51 +++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 45 insertions(+), 6 deletions(-)

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);
 
 

--
Gitblit v1.8.0