Files
2025-12-03 11:12:34 +08:00

147 lines
4.9 KiB
C

#ifndef __BUFFER_MANAGER_H__
#define __BUFFER_MANAGER_H__
// 缓存buf的状态定义
typedef enum buffer_status_def {
BUFFER_STATUS_INIT, // 初始
BUFFER_STATUS_IDLE, // 空闲
BUFFER_STATUS_LOCK, // 锁定
BUFFER_STATUS_PEND, // 等待
BUFFER_STATUS_USED, // 使用
} BUFFER_STATUS;
// buffer管理原生API,不建议直接调用原生API,
// 防止后续库升级导致调用方法改变,使用时请调用重封装的快捷调用
int buffer_manager_set_default_handler(void *buffer_hdl);
void buffer_manager_set_memory_callback(void *(*malloc)(int size, u32 ram_type, u32 module_type), void (*free)(void *p, u32 ram_type, u32 module_type));
void *buffer_manager_init_handler(u32 buf_list[], int buf_num);
void buffer_manager_free_handler(void *buffer_hdl);
int buffer_manager_set_buf_status(void *buffer_hdl, void *buf, int status);
int buffer_manager_get_buf_status(void *buffer_hdl, void *buf);
void *buffer_manager_get_buf_by_status(void *buffer_hdl, int status);
void *buffer_manager_change_buf_status(void *buffer_hdl, int target, int result);
void *buffer_manager_status_dump(void *buffer_hdl);
/* buffer管理API快捷调用 */
// 注册buffer管理模块的回调
#define buffer_manager_callback(malloc, free) \
buffer_manager_set_memory_callback(malloc, free)
// 初始化buffer管理,创建buffer管理句柄
#define buffer_manager_init(hdl, buf, size, block_num) \
{ \
int BM_i = 0; \
int BM_buf_size = (size) / (block_num); \
u32 BM_buf_list[3] = {0}; \
for (BM_i = 0; BM_i < (block_num); BM_i++) { \
BM_buf_list[BM_i] = (u32)((buf) + (BM_buf_size * BM_i)); \
} \
(hdl) = buffer_manager_init_handler(BM_buf_list, (block_num)); \
}
// 释放buffer管理资源和句柄
#define buffer_manager_free(buffer_handler) \
buffer_manager_free_handler(buffer_handler)
// 设置指定buffer的状态
#define set_buffer_status(buffer_handler, buf_addr, status) \
buffer_manager_set_buf_status(buffer_handler, buf_addr, status)
// 获取指定buffer的状态
#define get_buffer_status(buffer_handler, buf_addr) \
buffer_manager_get_buf_status(buffer_handler, buf_addr)
// 获取指定状态的buffer
#define get_buffer_by_status(buffer_handler, status) \
buffer_manager_get_buf_by_status(buffer_handler, status)
// 获取目标状态的buffer,并修改为结果状态
#define change_buffer_status(buffer_handler, target, result) \
buffer_manager_change_buf_status(buffer_handler, target, result)
// 设置默认句柄,可以设置一个默认句柄,该句柄将作为buffer管理的静态变量,外部无需每次操作都传入该句柄
// 需要注意的时,buffer_manager_free时,可以传入NULL来释放默认句柄,但大buffer还需外面主动释放
// 即:buffer管理只做状态管理,和自身资源的申请、释放,不管被管理的buffer申请和释放
#define set_default_buffer_handler(buffer_handler) \
buffer_manager_set_default_handler(buffer_handler)
/* 快捷获取指定状态的buffer */
// 获取空闲状态的buffer
#define get_idle_buffer(buffer_handler) \
get_buffer_by_status(buffer_handler, BUFFER_STATUS_IDLE)
// 获取锁定状态的buffer
#define get_lock_buffer(buffer_handler) \
get_buffer_by_status(buffer_handler, BUFFER_STATUS_LOCK)
// 获取等待状态的buffer
#define get_pend_buffer(buffer_handler) \
get_buffer_by_status(buffer_handler, BUFFER_STATUS_PEND)
// 获取使用状态的buffer
#define get_used_buffer(buffer_handler) \
get_buffer_by_status(buffer_handler, BUFFER_STATUS_USED)
/* 快捷获取指定状态的buffer,并修改buffer状态 */
// 获取空闲状态的buffer,并修改为锁定状态
#define get_idle_buffer_to_lock(buffer_handler) \
change_buffer_status(buffer_handler, BUFFER_STATUS_IDLE, BUFFER_STATUS_LOCK)
// 获取锁定状态的buffer,并修改为等待状态
#define get_lock_buffer_to_pend(buffer_handler) \
change_buffer_status(buffer_handler, BUFFER_STATUS_LOCK, BUFFER_STATUS_PEND)
// 获取等待状态的buffer,并修改为使用状态
#define get_pend_buffer_to_used(buffer_handler) \
change_buffer_status(buffer_handler, BUFFER_STATUS_PEND, BUFFER_STATUS_USED)
// 获取使用状态的buffer,并修改为空闲状态
#define get_used_buffer_to_idle(buffer_handler) \
change_buffer_status(buffer_handler, BUFFER_STATUS_USED, BUFFER_STATUS_IDLE)
/* 快捷设置指定buffer的状态 */
// 设置buffer状态为空闲
#define set_buffer_idle(buffer_handler, buf) \
set_buffer_status(buffer_handler, buf, BUFFER_STATUS_IDLE)
// 设置buffer状态为锁定
#define set_buffer_lock(buffer_handler, buf) \
set_buffer_status(buffer_handler, buf, BUFFER_STATUS_LOCK)
// 设置buffer状态为等待
#define set_buffer_pend(buffer_handler, buf) \
set_buffer_status(buffer_handler, buf, BUFFER_STATUS_PEND)
// 设置buffer状态为使用
#define set_buffer_used(buffer_handler, buf) \
set_buffer_status(buffer_handler, buf, BUFFER_STATUS_USED)
#endif