1. 增加基于HMem的SendBuffer

This commit is contained in:
coffee 2026-04-01 15:17:23 +08:00
parent da4f8f8d23
commit 6a368bd720
2 changed files with 272 additions and 0 deletions

83
include/HSendBuffer.h Normal file
View 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
View 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);
}