104 lines
2.4 KiB
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);
|
|
}
|
|
} |