| 16 | */ |
| 17 | |
| 18 | static struct tb_mem_block * |
| 19 | tb_pool(struct tb_mem_pool *pool, size_t sz) |
| 20 | { |
| 21 | struct tb_mem_block *block; |
| 22 | uint8_t *ptr; |
| 23 | size_t size; |
| 24 | |
| 25 | size = sz + pool->alignment - 1; |
| 26 | block = calloc(1, size + sizeof(*pool->block)); |
| 27 | if (block == NULL) { |
| 28 | RTE_LOG(ERR, MALLOC, "%s(%zu)\n failed, currently allocated " |
| 29 | "by pool: %zu bytes\n", __func__, sz, pool->alloc); |
| 30 | siglongjmp(pool->fail, -ENOMEM); |
| 31 | return NULL; |
| 32 | } |
| 33 | |
| 34 | block->pool = pool; |
| 35 | |
| 36 | block->next = pool->block; |
| 37 | pool->block = block; |
| 38 | |
| 39 | pool->alloc += size; |
| 40 | |
| 41 | ptr = (uint8_t *)(block + 1); |
| 42 | block->mem = RTE_PTR_ALIGN_CEIL(ptr, pool->alignment); |
| 43 | block->size = size - (block->mem - ptr); |
| 44 | |
| 45 | return block; |
| 46 | } |
| 47 | |
| 48 | void * |
| 49 | tb_alloc(struct tb_mem_pool *pool, size_t size) |