89 lines
2.0 KiB
C
89 lines
2.0 KiB
C
/*********************************************************************************************
|
|
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 <stdio.h>
|
|
|
|
// 创建
|
|
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;
|
|
}
|
|
|
|
// 将不用的内存归还给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);
|
|
}
|
|
} |