/********************************************************************************************* Description: In-thread memory allocation with boundary aligned Copyright : All right reserved by NCIC.ICT Author : Zhang Zhonghai Date : 2023/08/23 ***********************************************************************************************/ #include "thread_mem.h" #include #include // 创建 thread_mem_t *create_thread_mem() { thread_mem_t *tmem = (thread_mem_t *)malloc(sizeof(thread_mem_t)); tmem->occupied = tmem->capacity = 0; tmem->mem = 0; return tmem; } // 初始化 void init_thread_mem(thread_mem_t *tmem) { tmem->occupied = tmem->capacity = 0; tmem->mem = 0; } // 初始化并开辟一定量的内存 void thread_mem_init_alloc(thread_mem_t *tmem, size_t byte_cnt) { tmem->capacity = byte_cnt; tmem->mem = malloc(tmem->capacity); tmem->occupied = 0; } // 请求内存 void *thread_mem_request(thread_mem_t *tmem, size_t byte_cnt) { void *ret_mem = 0; if (tmem == 0) { ret_mem = 0; } else if (tmem->capacity == 0) { tmem->capacity = byte_cnt; tmem->mem = malloc(tmem->capacity); tmem->occupied = byte_cnt; ret_mem = tmem->mem; } else if (tmem->capacity - tmem->occupied >= byte_cnt) { ret_mem = tmem->mem + tmem->occupied; tmem->occupied += byte_cnt; } else { tmem->capacity = tmem->occupied + byte_cnt; tmem->mem = realloc(tmem->mem, tmem->capacity); ret_mem = tmem->mem + tmem->occupied; tmem->occupied += byte_cnt; } return ret_mem; } void *thread_mem_request_and_clean(thread_mem_t *tmem, size_t byte_cnt) { void *mem = thread_mem_request(tmem, byte_cnt); memset(mem, 0, byte_cnt); return mem; } // 将不用的内存归还给thread mem void thread_mem_release(thread_mem_t *tmem, size_t byte_cnt) { tmem->occupied -= byte_cnt; } // 彻底释放内存 void thread_mem_free(thread_mem_t *tmem) { tmem->capacity = tmem->occupied = 0; free(tmem->mem); tmem->mem = 0; } // 销毁thread_mem_t void destroy_thread_mem(thread_mem_t *tmem) { if (tmem != 0) { thread_mem_free(tmem); free(tmem); } }