20260829 Redesign
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
#include "c_FixedPool.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "c_Test.h"
|
||||
#include "c_Memory.h"
|
||||
|
||||
/* ==============================================================================
|
||||
* 🧪 1. 测试静态“零堆分配”初始化与边界耗尽拦截
|
||||
* ============================================================================== */
|
||||
C_TEST_CASE(test_fixed_pool_zero_heap_allocation)
|
||||
{
|
||||
/* 1. 模拟在外部开辟一块 64 字节的纯裸静态缓冲区(预期能刚好容纳 2 个 32 字节网格) */
|
||||
int static_buffer_size = 64;
|
||||
void* my_external_static_buffer = C_ALLOC(static_buffer_size);
|
||||
|
||||
c_FixedPool_t pool;
|
||||
/* 🛠️ 核心调用:在初始化时直接绑定外部给定的裸空间,内部绝对不发生任何系统级 malloc */
|
||||
c_err_t err = c_FixedPool_Init(&pool, 24, my_external_static_buffer, static_buffer_size);
|
||||
|
||||
C_ASSERT_INT_EQ(err, C_SUCCESS, "静态内存池绑定初始化必须返回 C_OK");
|
||||
C_ASSERT_INT_EQ(pool.objSize, 32, "对象尺寸自动向上休整为最大自然对齐边界(16字节倍数)");
|
||||
|
||||
/* 2. 连续分发出仅有的 2 个格子 */
|
||||
void* node_1 = c_FixedPool_Alloc(&pool);
|
||||
void* node_2 = c_FixedPool_Alloc(&pool);
|
||||
C_ASSERT(node_1 != NULL && node_2 != NULL, "静态网格正常分配通过");
|
||||
C_ASSERT_INT_EQ(pool.instanceCount, 2, "当前贷出活跃数为 2");
|
||||
|
||||
/* 3. 🚨 边界触碰:由于外部给的空间已用尽,且本池严禁私自动态扩容,再次 Alloc 必须安全返回 NULL */
|
||||
void* overflow_node = c_FixedPool_Alloc(&pool);
|
||||
C_ASSERT(overflow_node == NULL, "静态内存池耗尽后,再次 Alloc 必须严格拦截并安全回传 NULL");
|
||||
|
||||
// 清理测试用的外部大模拟区
|
||||
c_FixedPool_DryUp(&pool);
|
||||
c_FixedPool_Destroy(&pool);
|
||||
C_FREE(my_external_static_buffer);
|
||||
}
|
||||
|
||||
|
||||
/* ==============================================================================
|
||||
* 🧪 2. 测试中途外部喂入新页补充弹药 (c_FixedPool_AddBlock)
|
||||
* ============================================================================== */
|
||||
C_TEST_CASE(test_fixed_pool_external_ammunition_supply)
|
||||
{
|
||||
/* 准备初始极微小外部缓冲区(仅容纳 1 个对象) */
|
||||
int buf_size_1 = 32;
|
||||
void* ext_buf_1 = C_ALLOC(buf_size_1);
|
||||
|
||||
c_FixedPool_t pool;
|
||||
c_FixedPool_Init(&pool, 32, ext_buf_1, buf_size_1);
|
||||
|
||||
/* 掏空这仅有的一个额度 */
|
||||
void* active_ptr = c_FixedPool_Alloc(&pool);
|
||||
C_ASSERT(active_ptr != NULL, "初始第一发额度分配成功");
|
||||
C_ASSERT(c_FixedPool_Alloc(&pool) == NULL, "此时池子已瞬间干瘪");
|
||||
|
||||
/* 🛠️ 核心调用:外部在中途遇到短缺时,手动申请一块新静态大页,通过 AddBlock 喂给池子 */
|
||||
int buf_size_2 = 96; /* 预期能额外提供 3 个全新格子 */
|
||||
void* ext_buf_2 = C_ALLOC(buf_size_2);
|
||||
|
||||
c_err_t add_err = c_FixedPool_AddBlock(&pool, ext_buf_2, buf_size_2);
|
||||
C_ASSERT_INT_EQ(add_err, C_ERR_OK, "手动注入新页弹药必须返回 C_OK");
|
||||
|
||||
/* 4. 再次检验:池子应当立刻恢复发牌能力,连续顺畅吐出 3 个新对象 */
|
||||
void* extra_node_1 = c_FixedPool_Alloc(&pool);
|
||||
void* extra_node_2 = c_FixedPool_Alloc(&pool);
|
||||
void* extra_node_3 = c_FixedPool_Alloc(&pool);
|
||||
|
||||
C_ASSERT(extra_node_1 != NULL && extra_node_2 != NULL && extra_node_3 != NULL, "补给新弹药后,FixedPool 必须成功复活");
|
||||
C_ASSERT_INT_EQ(pool.instanceCount, 4, "当前总计贷出 4 个活跃对象");
|
||||
|
||||
/* 5. 验证 DryUp 强行重置计数 */
|
||||
c_FixedPool_DryUp(&pool);
|
||||
C_ASSERT_INT_EQ(pool.instanceCount, 0, "执行 DryUp 后,贷出追踪计数必须瞬间斩断强制复位为 0");
|
||||
|
||||
/* 清理现场 */
|
||||
// c_FixedPool_Free(&pool, extra_node_3); /* 侵入式回收依然畅通 */
|
||||
// c_FixedPool_DryUp(&pool);
|
||||
c_FixedPool_Destroy(&pool);
|
||||
C_FREE(ext_buf_1);
|
||||
C_FREE(ext_buf_2);
|
||||
}
|
||||
|
||||
/* ==============================================================================
|
||||
* 🚀 测试套件统一注册调度主函数
|
||||
* ============================================================================== */
|
||||
|
||||
|
||||
int main(int argc, char** argv){
|
||||
C_TEST_SUITE_BEGIN(MemoryFixedPoolCoreTestSuite)
|
||||
C_RUN_TEST_CASE(test_fixed_pool_zero_heap_allocation);
|
||||
C_RUN_TEST_CASE(test_fixed_pool_external_ammunition_supply);
|
||||
C_TEST_SUITE_END()
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user