/********************************************************************************************* Description: byte memory allocation with boundary aligned Copyright : All right reserved by NCIC.ICT Author : Zhang Zhonghai Date : 2023/08/23 ***********************************************************************************************/ #include "byte_alloc.h" #include #include // 创建 byte_mem_t *create_byte_mem() { byte_mem_t *bmem = (byte_mem_t *)malloc(sizeof(byte_mem_t)); bmem->occupied = bmem->capacity = 0; bmem->mem = 0; return bmem; } // 初始化 void init_byte_mem(byte_mem_t *bmem) { bmem->occupied = bmem->capacity = 0; bmem->mem = 0; } // 初始化并开辟一定量的内存 void byte_mem_init_alloc(byte_mem_t *bmem, size_t byte_cnt) { bmem->capacity = byte_cnt; bmem->mem = malloc(bmem->capacity); bmem->occupied = 0; } // 请求内存 void *byte_mem_request(byte_mem_t *bmem, size_t byte_cnt) { // fprintf(stderr, "capacity:%ld, occupied: %ld, byte_cnt: %ld\n", bmem->capacity, bmem->occupied, byte_cnt); void *ret_mem = 0; if (bmem == 0) { ret_mem = 0; } else if (bmem->capacity == 0) { bmem->capacity = byte_cnt; bmem->mem = malloc(bmem->capacity); bmem->occupied = byte_cnt; ret_mem = bmem->mem; } else if (bmem->capacity - bmem->occupied >= byte_cnt) { ret_mem = bmem->mem + bmem->occupied; bmem->occupied += byte_cnt; } else { bmem->capacity = bmem->occupied + byte_cnt; bmem->mem = realloc(bmem->mem, bmem->capacity); ret_mem = bmem->mem + bmem->occupied; bmem->occupied += byte_cnt; } return ret_mem; } void *byte_mem_request_and_clean(byte_mem_t *bmem, size_t byte_cnt) { void *mem = byte_mem_request(bmem, byte_cnt); memset(mem, 0, byte_cnt); return mem; } // 将不用的内存归还给byte mem void byte_mem_release(byte_mem_t *bmem, size_t byte_cnt) { bmem->occupied -= byte_cnt; } void byte_mem_clear(byte_mem_t *bmem) { bmem->occupied = 0; } // 彻底释放内存 void byte_mem_free(byte_mem_t *bmem) { bmem->capacity = bmem->occupied = 0; free(bmem->mem); bmem->mem = 0; } // 销毁byte_mem_t void destroy_byte_mem(byte_mem_t *bmem) { if (bmem != 0) { byte_mem_free(bmem); free(bmem); } }