diff --git a/AppKit/fixed_rbtree_pool.c b/AppKit/fixed_rbtree_pool.c index 3450136..04beb9a 100644 --- a/AppKit/fixed_rbtree_pool.c +++ b/AppKit/fixed_rbtree_pool.c @@ -1,5 +1,6 @@ #include #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 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); } -void 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); +os_bool_t fixed_rbtree_pool_add_node_pool(fixed_rbtree_pool_t* self, void* node_block, os_size_t 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){ while(self->root){ rbtree_node_t * p = self->root; + pool_destroy(&p->pool); node_remove(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); if(x==NULL){ x = pool_alloc(&self->node_pool); + if(!x) return OS_FALSE; node_init(self, x, obj_size, block, block_size); node_insert(self, x); }else{ 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){ 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){ 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){ if(!ptr) return; 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){ return; } - pool_free(&self->node_pool, ptr); + pool_free(&x->pool, ptr); } diff --git a/AppKit/fixed_rbtree_pool.h b/AppKit/fixed_rbtree_pool.h index 131237d..1868149 100644 --- a/AppKit/fixed_rbtree_pool.h +++ b/AppKit/fixed_rbtree_pool.h @@ -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_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_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_free(fixed_rbtree_pool_t* self, os_size_t obj_size, void* ptr); diff --git a/AppKit/pool.c b/AppKit/pool.c index b79b1ca..f1fb470 100644 --- a/AppKit/pool.c +++ b/AppKit/pool.c @@ -2,13 +2,15 @@ #include "os_macros.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 start = OS_ALIGN_UP(init_start, OS_ALIGN_SIZE); // 向上对齐后的位置 block_size -= (start - init_start); // 实际使用的块大小 - OS_ASSERT(block_size > self->obj_size); + if(block_size < self->obj_size){ + return OS_FALSE; + } // 将内存块拆成 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; self->free_list_p = (pool_link_t*)start; self->capacity += count; + + return OS_TRUE; } diff --git a/AppKit/pool.h b/AppKit/pool.h index 547d710..e253722 100644 --- a/AppKit/pool.h +++ b/AppKit/pool.h @@ -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; @@ -57,6 +57,14 @@ void pool_init(pool_t* self, os_size_t obj_size){ 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 void* pool_alloc(pool_t* self){ if(!self->free_list_p){