1. 增加基于HMem的SendBuffer
This commit is contained in:
parent
da4f8f8d23
commit
6a368bd720
83
include/HSendBuffer.h
Normal file
83
include/HSendBuffer.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/**
|
||||||
|
* 日期: 2026-03-31
|
||||||
|
* 作者: coffee
|
||||||
|
* 描述: 基于 HMem 的发送缓冲区
|
||||||
|
* 默认预留前头空间, 便于上层先构建内容, 下层再补发包前头
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __H_SEND_BUFFER_H__
|
||||||
|
#define __H_SEND_BUFFER_H__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 默认预留的前头空间
|
||||||
|
*/
|
||||||
|
#ifndef HSEND_BUFFER_FIRST_OFFSET
|
||||||
|
#define HSEND_BUFFER_FIRST_OFFSET 30u
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 创建发送缓冲区
|
||||||
|
* @param size 初始可用数据区大小
|
||||||
|
* @return 成功返回数据区指针, 失败返回 NULL
|
||||||
|
*/
|
||||||
|
void *HSendBufferGet(size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 调整发送缓冲区当前使用长度
|
||||||
|
* @param ptr 发送缓冲区指针
|
||||||
|
* @param size 新的当前数据长度(包含已经补上的前头)
|
||||||
|
* @return 成功返回新的缓冲区指针, 失败返回 NULL
|
||||||
|
*/
|
||||||
|
void *HSendBufferRealloc(void *ptr, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 往前头追加数据
|
||||||
|
* @param ptr 发送缓冲区指针
|
||||||
|
* @param data 要写入前头的数据, 传 NULL 时仅预留空间
|
||||||
|
* @param size 前头追加长度
|
||||||
|
* @return
|
||||||
|
* - 成功返回新的缓冲区指针
|
||||||
|
* - 前头空间不足时返回原指针
|
||||||
|
* - 非法指针返回 NULL
|
||||||
|
*/
|
||||||
|
void *HSendBufferAddHead(void *ptr, const void *data, uint8_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 增加引用计数
|
||||||
|
* @param ptr 发送缓冲区指针
|
||||||
|
* @return 成功返回原指针, 失败返回 NULL
|
||||||
|
*/
|
||||||
|
void *HSendBufferAddRef(void *ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 释放发送缓冲区
|
||||||
|
* @param ptr 发送缓冲区指针
|
||||||
|
* @return 成功返回1, 失败返回0
|
||||||
|
*/
|
||||||
|
uint8_t HSendBufferFree(void *ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 判断是否为 HSendBuffer
|
||||||
|
* @param ptr 待判断指针
|
||||||
|
* @return 是返回1, 否返回0
|
||||||
|
*/
|
||||||
|
uint8_t HSendBufferIsValid(const void *ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取当前剩余前头偏移
|
||||||
|
* @param ptr 发送缓冲区指针
|
||||||
|
* @return 偏移量, 非法指针返回0
|
||||||
|
*/
|
||||||
|
uint8_t HSendBufferGetFrontOffset(const void *ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取当前前头剩余大小
|
||||||
|
* @param ptr 发送缓冲区指针
|
||||||
|
* @return 剩余前头大小, 非法指针返回0
|
||||||
|
*/
|
||||||
|
uint8_t HSendBufferGetHeadRemainSize(const void *ptr);
|
||||||
|
|
||||||
|
#endif // __H_SEND_BUFFER_H__
|
||||||
189
src/HSendBuffer.c
Normal file
189
src/HSendBuffer.c
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
/**
|
||||||
|
* 日期: 2026-03-31
|
||||||
|
* 作者: coffee
|
||||||
|
* 描述: 基于 HMem 的发送缓冲区实现
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "HSendBuffer.h"
|
||||||
|
#include "HMem.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define HSEND_BUFFER_MAGIC 0xA5u
|
||||||
|
#define HSEND_BUFFER_INFO_SIZE 2u
|
||||||
|
|
||||||
|
typedef struct HSendBufferInfo {
|
||||||
|
uint8_t magic;
|
||||||
|
uint8_t frontOffset;
|
||||||
|
} HSendBufferInfo;
|
||||||
|
|
||||||
|
static HSendBufferInfo *GetInfo(const void *ptr) {
|
||||||
|
if (ptr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (HSendBufferInfo *)((uint8_t *)ptr - HSEND_BUFFER_INFO_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t IsValidInfo(const HSendBufferInfo *info) {
|
||||||
|
if (info == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return info->magic == HSEND_BUFFER_MAGIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t *GetRawPtr(const void *ptr) {
|
||||||
|
HSendBufferInfo *info = GetInfo(ptr);
|
||||||
|
if (!IsValidInfo(info)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (uint8_t *)ptr - info->frontOffset - HSEND_BUFFER_INFO_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t *GetUserPtr(void *rawPtr, uint8_t frontOffset) {
|
||||||
|
if (rawPtr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (uint8_t *)rawPtr + HSEND_BUFFER_INFO_SIZE + frontOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetInfo(void *ptr, uint8_t frontOffset) {
|
||||||
|
HSendBufferInfo *info = GetInfo(ptr);
|
||||||
|
info->magic = HSEND_BUFFER_MAGIC;
|
||||||
|
info->frontOffset = frontOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *HSendBufferGet(size_t size) {
|
||||||
|
size_t totalSize = HSEND_BUFFER_INFO_SIZE + HSEND_BUFFER_FIRST_OFFSET + size;
|
||||||
|
uint8_t *rawPtr = HMemMalloc(totalSize);
|
||||||
|
uint8_t *userPtr;
|
||||||
|
|
||||||
|
if (rawPtr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
userPtr = GetUserPtr(rawPtr, HSEND_BUFFER_FIRST_OFFSET);
|
||||||
|
SetInfo(userPtr, HSEND_BUFFER_FIRST_OFFSET);
|
||||||
|
|
||||||
|
return userPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *HSendBufferRealloc(void *ptr, size_t size) {
|
||||||
|
HSendBufferInfo *info;
|
||||||
|
uint8_t frontOffset;
|
||||||
|
uint8_t *rawPtr;
|
||||||
|
uint8_t *newRawPtr;
|
||||||
|
size_t totalSize;
|
||||||
|
|
||||||
|
if (ptr == NULL) {
|
||||||
|
return HSendBufferGet(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
info = GetInfo(ptr);
|
||||||
|
if (!IsValidInfo(info)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == 0u) {
|
||||||
|
HSendBufferFree(ptr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
frontOffset = info->frontOffset;
|
||||||
|
|
||||||
|
rawPtr = GetRawPtr(ptr);
|
||||||
|
if (rawPtr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
totalSize = HSEND_BUFFER_INFO_SIZE + frontOffset + size;
|
||||||
|
newRawPtr = HMemRealloc(rawPtr, totalSize);
|
||||||
|
if (newRawPtr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = GetUserPtr(newRawPtr, frontOffset);
|
||||||
|
SetInfo(ptr, frontOffset);
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *HSendBufferAddHead(void *ptr, const void *data, uint8_t size) {
|
||||||
|
HSendBufferInfo *info;
|
||||||
|
uint8_t newFrontOffset;
|
||||||
|
uint8_t *newPtr;
|
||||||
|
|
||||||
|
if (ptr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
info = GetInfo(ptr);
|
||||||
|
if (!IsValidInfo(info)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size > info->frontOffset) {
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == 0u) {
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
newFrontOffset = (uint8_t)(info->frontOffset - size);
|
||||||
|
newPtr = (uint8_t *)ptr - size;
|
||||||
|
info->magic = 0u;
|
||||||
|
|
||||||
|
if (data != NULL) {
|
||||||
|
memmove(newPtr, data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetInfo(newPtr, newFrontOffset);
|
||||||
|
|
||||||
|
return newPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *HSendBufferAddRef(void *ptr) {
|
||||||
|
uint8_t *rawPtr = GetRawPtr(ptr);
|
||||||
|
|
||||||
|
if (rawPtr == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HMemAddRef(rawPtr, 0) == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HSendBufferFree(void *ptr) {
|
||||||
|
uint8_t *rawPtr = GetRawPtr(ptr);
|
||||||
|
|
||||||
|
if (rawPtr == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HMemFree(rawPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HSendBufferIsValid(const void *ptr) {
|
||||||
|
return IsValidInfo(GetInfo(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HSendBufferGetFrontOffset(const void *ptr) {
|
||||||
|
HSendBufferInfo *info = GetInfo(ptr);
|
||||||
|
|
||||||
|
if (!IsValidInfo(info)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return info->frontOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t HSendBufferGetHeadRemainSize(const void *ptr) {
|
||||||
|
return HSendBufferGetFrontOffset(ptr);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user