This commit is contained in:
2026-07-09 10:16:24 +08:00
parent 946ae6ac9a
commit 4cb5880258
4 changed files with 27 additions and 12 deletions
+10 -7
View File
@@ -1,5 +1,6 @@
#include <fixed_rbtree_pool.h> #include <fixed_rbtree_pool.h>
#include "os_macros.h" #include "os_macros.h"
/* ------------------------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------------------------ */
/* */ /* */
@@ -28,7 +29,7 @@ void node_init(rbtree_t* tree, rbtree_node_t* self, os_size_t obj_size, void* bl
static static
int node_cmp(const os_size_t obj_size, const rbtree_node_t* x, void* args){ int node_cmp(const os_size_t obj_size, const rbtree_node_t* x, void* args){
return (obj_size == x->pool.obj_size)?0:((obj_size > x->pool.obj_size)?1:-1); return OS_COMPARE(obj_size, x->pool.obj_size);
} }
/* ------------------------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------------------------ */
@@ -427,32 +428,35 @@ void fixed_rbtree_pool_init(fixed_rbtree_pool_t* self, void* node_block, os_size
pool_add_block(&self->node_pool, node_block, node_block_size); pool_add_block(&self->node_pool, node_block, node_block_size);
} }
void fixed_rbtree_pool_add_node_pool(fixed_rbtree_pool_t* self, void* node_block, os_size_t node_block_size){ os_bool_t fixed_rbtree_pool_add_node_pool(fixed_rbtree_pool_t* self, void* node_block, os_size_t node_block_size){
pool_add_block(&self->node_pool, node_block, node_block_size); return pool_add_block(&self->node_pool, node_block, node_block_size);
} }
void fixed_rbtree_pool_destroy(fixed_rbtree_pool_t* self){ void fixed_rbtree_pool_destroy(fixed_rbtree_pool_t* self){
while(self->root){ while(self->root){
rbtree_node_t * p = self->root; rbtree_node_t * p = self->root;
pool_destroy(&p->pool);
node_remove(self, p); node_remove(self, p);
node_destroy(self, p); node_destroy(self, p);
} }
pool_destroy(&self->node_pool);
} }
void fixed_rbtree_pool_add(fixed_rbtree_pool_t* self, os_size_t obj_size, void* block, os_size_t block_size){ os_bool_t fixed_rbtree_pool_add(fixed_rbtree_pool_t* self, os_size_t obj_size, void* block, os_size_t block_size){
rbtree_node_t* x = find(self, obj_size, self->root); rbtree_node_t* x = find(self, obj_size, self->root);
if(x==NULL){ if(x==NULL){
x = pool_alloc(&self->node_pool); x = pool_alloc(&self->node_pool);
if(!x) return OS_FALSE;
node_init(self, x, obj_size, block, block_size); node_init(self, x, obj_size, block, block_size);
node_insert(self, x); node_insert(self, x);
}else{ }else{
pool_add_block(&x->pool, block, block_size); pool_add_block(&x->pool, block, block_size);
} }
return OS_TRUE;
} }
void* fixed_rbtree_pool_alloc(fixed_rbtree_pool_t* self, os_size_t obj_size){ void* fixed_rbtree_pool_alloc(fixed_rbtree_pool_t* self, os_size_t obj_size){
rbtree_node_t * x = find(self, obj_size, self->root); rbtree_node_t * x = find(self, obj_size, self->root);
OS_ASSERT(x, "No pool exist for obj_size: %"OS_PRIu, obj_size);
if(x==NULL){ if(x==NULL){
return NULL; return NULL;
} }
@@ -462,10 +466,9 @@ void* fixed_rbtree_pool_alloc(fixed_rbtree_pool_t* self, os_size_t obj_size){
void fixed_rbtree_pool_free(fixed_rbtree_pool_t* self, os_size_t obj_size, void* ptr){ void fixed_rbtree_pool_free(fixed_rbtree_pool_t* self, os_size_t obj_size, void* ptr){
if(!ptr) return; if(!ptr) return;
rbtree_node_t * x = find(self, obj_size, self->root); rbtree_node_t * x = find(self, obj_size, self->root);
OS_ASSERT(x, "No pool exist for obj_size: %"OS_PRIu, obj_size);
if(x==NULL){ if(x==NULL){
return; return;
} }
pool_free(&self->node_pool, ptr); pool_free(&x->pool, ptr);
} }
+2 -2
View File
@@ -33,10 +33,10 @@ typedef struct {
/* */ /* */
void fixed_rbtree_pool_init(fixed_rbtree_pool_t* self, void* node_block, os_size_t node_block_size); void fixed_rbtree_pool_init(fixed_rbtree_pool_t* self, void* node_block, os_size_t node_block_size);
void fixed_rbtree_pool_add_node_pool(fixed_rbtree_pool_t* self, void* node_block, os_size_t node_block_size); os_bool_t fixed_rbtree_pool_add_node_pool(fixed_rbtree_pool_t* self, void* node_block, os_size_t node_block_size);
void fixed_rbtree_pool_destroy(fixed_rbtree_pool_t* self); void fixed_rbtree_pool_destroy(fixed_rbtree_pool_t* self);
void fixed_rbtree_pool_add(fixed_rbtree_pool_t* self, os_size_t obj_size, void* block, os_size_t block_size); os_bool_t fixed_rbtree_pool_add(fixed_rbtree_pool_t* self, os_size_t obj_size, void* block, os_size_t block_size);
void* fixed_rbtree_pool_alloc(fixed_rbtree_pool_t* self, os_size_t obj_size); void* fixed_rbtree_pool_alloc(fixed_rbtree_pool_t* self, os_size_t obj_size);
void fixed_rbtree_pool_free(fixed_rbtree_pool_t* self, os_size_t obj_size, void* ptr); void fixed_rbtree_pool_free(fixed_rbtree_pool_t* self, os_size_t obj_size, void* ptr);
+6 -2
View File
@@ -2,13 +2,15 @@
#include "os_macros.h" #include "os_macros.h"
#include "os_align.h" #include "os_align.h"
void pool_add_block(pool_t* self, void* block, os_size_t block_size){ os_bool_t pool_add_block(pool_t* self, void* block, os_size_t block_size){
// 对齐 // 对齐
os_uintptr_t init_start = (os_uintptr_t)block; // 初始的位置 os_uintptr_t init_start = (os_uintptr_t)block; // 初始的位置
os_uintptr_t start = OS_ALIGN_UP(init_start, OS_ALIGN_SIZE); // 向上对齐后的位置 os_uintptr_t start = OS_ALIGN_UP(init_start, OS_ALIGN_SIZE); // 向上对齐后的位置
block_size -= (start - init_start); // 实际使用的块大小 block_size -= (start - init_start); // 实际使用的块大小
OS_ASSERT(block_size > self->obj_size); if(block_size < self->obj_size){
return OS_FALSE;
}
// 将内存块拆成 obj_size 大小 // 将内存块拆成 obj_size 大小
os_size_t count = block_size/self->obj_size; os_size_t count = block_size/self->obj_size;
@@ -19,5 +21,7 @@ void pool_add_block(pool_t* self, void* block, os_size_t block_size){
((pool_link_t*)last)->next = 0; ((pool_link_t*)last)->next = 0;
self->free_list_p = (pool_link_t*)start; self->free_list_p = (pool_link_t*)start;
self->capacity += count; self->capacity += count;
return OS_TRUE;
} }
+9 -1
View File
@@ -30,7 +30,7 @@ typedef struct {
/* ------------------------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------------------------ */
/* */ /* */
void pool_add_block(pool_t* self, void* block, os_size_t block_size); os_bool_t pool_add_block(pool_t* self, void* block, os_size_t block_size);
/* /*
* pool_t pool; * pool_t pool;
@@ -57,6 +57,14 @@ void pool_init(pool_t* self, os_size_t obj_size){
self->capacity = 0; self->capacity = 0;
} }
OS_STATIC_FORCE_INLINE
void pool_destroy(pool_t* self){
self->free_list_p = 0;
self->obj_size = 0;
self->count = 0;
self->capacity = 0;
}
OS_STATIC_FORCE_INLINE OS_STATIC_FORCE_INLINE
void* pool_alloc(pool_t* self){ void* pool_alloc(pool_t* self){
if(!self->free_list_p){ if(!self->free_list_p){