void * region_reserve_slow(struct region *region, size_t size) { /* The new slab must have at least this many bytes available. */ size_t slab_min_size = size + rslab_sizeof() - slab_sizeof(); struct rslab *slab; slab = (struct rslab *) slab_get(region->cache, slab_min_size); if (slab == NULL) return NULL; slab->used = 0; /* * Sic: add the new slab to the beginning of the * region, even if it is full, otherwise, * region_truncate() won't work. */ slab_list_add(®ion->slabs, &slab->slab, next_in_list); return rslab_data(slab); }
void * mempool_alloc_nothrow(struct mempool *pool) { struct mslab *slab = mslab_tree_first(&pool->free_slabs); if (slab == NULL) { if (pool->spare == NULL) { slab = (struct mslab *) slab_get_with_order(pool->cache, pool->slab_order); if (slab == NULL) return NULL; mslab_create(slab, pool); slab_list_add(&pool->slabs, &slab->slab, next_in_list); } else { slab = pool->spare; pool->spare = NULL; } mslab_tree_insert(&pool->free_slabs, slab); } assert(slab->pool == pool); pool->slabs.stats.used += pool->objsize; return mslab_alloc(slab); }