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