sw_perf/byte_alloc.c

104 lines
2.4 KiB
C

/*********************************************************************************************
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 <stdio.h>
#include <string.h>
// 创建
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;
return 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;
return bmem->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);
}
}