/* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ tb_bool_t tb_memory_init(tb_allocator_ref_t allocator, tb_byte_t* data, tb_size_t size) { // done tb_bool_t ok = tb_false; do { // init page if (!tb_page_init()) break; // init the native memory if (!tb_native_memory_init()) break; // init the allocator g_allocator = allocator; // init the large pool data g_large_pool_data = data; g_large_pool_size = size; // init the pool tb_assert_and_check_break(tb_pool()); // ok ok = tb_true; } while (0); // failed? exit it if (!ok) tb_memory_exit(); // ok? return ok; }
void * tb_alloc(struct tb_mem_pool *pool, size_t size) { struct tb_mem_block *block; void *ptr; size_t new_sz; size = RTE_ALIGN_CEIL(size, pool->alignment); block = pool->block; if (block == NULL || block->size < size) { new_sz = (size > pool->min_alloc) ? size : pool->min_alloc; block = tb_pool(pool, new_sz); if (block == NULL) return NULL; } ptr = block->mem; block->size -= size; block->mem += size; return ptr; }