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