wangzhengquan
2020-07-14 e4ce347428a0d459c7561f7bb3e180f351c11a4f
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);