57 lines
1.7 KiB
C
57 lines
1.7 KiB
C
#include "c_FixedPool.h"
|
|||
|
|
#include <stdlib.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
int id;
|
||
|
|
char name[12];
|
||
|
|
} TestObject;
|
||
|
|
|
||
|
|
int main(int argc, char** argv){
|
||
|
|
|
||
|
|
printf("--- 開始執行 c_FixedPool_t 測試 ---\n");
|
||
|
|
|
||
|
|
// 建立兩個獨立的記憶體緩衝區
|
||
|
|
uint8_t block1[32]; // 約可容納 2 個 TestObject (16 bytes * 2 = 32, 考慮對齊足夠)
|
||
|
|
uint8_t block2[32];
|
||
|
|
|
||
|
|
c_FixedPool_t pool;
|
||
|
|
|
||
|
|
// 1. 初始化並掛載第一個區塊
|
||
|
|
c_err_t err = c_FixedPool_Init(&pool, sizeof(TestObject), block1, sizeof(block1));
|
||
|
|
assert(err == C_ERR_SUCCESS);
|
||
|
|
printf("初始化成功,當前可用總數: %zu\n", pool.instanceCount);
|
||
|
|
|
||
|
|
// 2. 持續分配直到第一個區塊耗盡
|
||
|
|
void* p1 = c_FixedPool_Alloc(&pool);
|
||
|
|
void* p2 = c_FixedPool_Alloc(&pool);
|
||
|
|
void* p3 = c_FixedPool_Alloc(&pool); // 超出 block1 的容量,應為 NULL
|
||
|
|
|
||
|
|
assert(p1 != NULL);
|
||
|
|
assert(p2 != NULL);
|
||
|
|
assert(p3 == NULL);
|
||
|
|
printf("第一階段分配完畢,池已成功耗盡 (OOM 觸發)。\n");
|
||
|
|
|
||
|
|
// 3. 動態追加第二個記憶體區塊 (AddBlock)
|
||
|
|
err = c_FixedPool_AddBlock(&pool, block2, sizeof(block2));
|
||
|
|
assert(err == C_ERR_SUCCESS);
|
||
|
|
printf("成功追加新區塊!當前可用總數增加。\n");
|
||
|
|
|
||
|
|
// 4. 再次分配,此時應該能成功從 block2 取得記憶體
|
||
|
|
void* p4 = c_FixedPool_Alloc(&pool);
|
||
|
|
assert(p4 != NULL);
|
||
|
|
assert(p4 != p1 && p4 != p2);
|
||
|
|
|
||
|
|
// 5. 測試回收與重複利用
|
||
|
|
c_FixedPool_Free(&pool, p1);
|
||
|
|
void* p_reuse = c_FixedPool_Alloc(&pool);
|
||
|
|
assert(p_reuse == p1); // 應優先拿回剛釋放的 p1 地址
|
||
|
|
|
||
|
|
// 6. 清理
|
||
|
|
c_FixedPool_DryUp(&pool);
|
||
|
|
c_FixedPool_Destroy(&pool);
|
||
|
|
|
||
|
|
printf("--- c_FixedPool_t 所有測試案例通過! ---\n");
|
||
|
|
return 0;
|
||
|
|
}
|