#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); // static int mem_pool_mutex = SemUtil::get(MEM_POOL_COND_KEY, 1); 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); #endif