Adding iree_arena_block_pool_preallocate.
Arena users can preallocate to ensure they have blocks available
that were allocated (maybe) with some spatial locality.
diff --git a/runtime/src/iree/base/internal/arena.c b/runtime/src/iree/base/internal/arena.c
index ba8f9e8..17f361d 100644
--- a/runtime/src/iree/base/internal/arena.c
+++ b/runtime/src/iree/base/internal/arena.c
@@ -41,6 +41,27 @@
IREE_TRACE_ZONE_END(z0);
}
+iree_status_t iree_arena_block_pool_preallocate(
+ iree_arena_block_pool_t* block_pool, iree_host_size_t count) {
+ IREE_TRACE_ZONE_BEGIN(z0);
+ IREE_TRACE_ZONE_APPEND_VALUE_I64(z0, count);
+
+ for (iree_host_size_t i = 0; i < count; ++i) {
+ uint8_t* block_base = NULL;
+ IREE_RETURN_AND_END_ZONE_IF_ERROR(
+ z0, iree_allocator_malloc_uninitialized(block_pool->block_allocator,
+ block_pool->total_block_size,
+ (void**)&block_base));
+ iree_arena_block_t* block =
+ iree_arena_block_trailer(block_pool, block_base);
+ iree_atomic_arena_block_slist_concat(&block_pool->available_slist, block,
+ block);
+ }
+
+ IREE_TRACE_ZONE_END(z0);
+ return iree_ok_status();
+}
+
void iree_arena_block_pool_trim(iree_arena_block_pool_t* block_pool) {
IREE_TRACE_ZONE_BEGIN(z0);
@@ -125,6 +146,7 @@
} while (head);
arena->allocation_head = NULL;
}
+
if (arena->block_head != NULL) {
#if defined(IREE_SANITIZER_ADDRESS)
iree_arena_block_t* block = arena->block_head;
@@ -141,6 +163,10 @@
arena->block_tail = NULL;
}
+ arena->total_allocation_size = 0;
+ arena->used_allocation_size = 0;
+ arena->block_bytes_remaining = 0;
+
IREE_TRACE_ZONE_END(z0);
}
diff --git a/runtime/src/iree/base/internal/arena.h b/runtime/src/iree/base/internal/arena.h
index 199e3fc..ad252b5 100644
--- a/runtime/src/iree/base/internal/arena.h
+++ b/runtime/src/iree/base/internal/arena.h
@@ -77,6 +77,10 @@
// back to it.
void iree_arena_block_pool_deinitialize(iree_arena_block_pool_t* block_pool);
+// Preallocates |count| blocks and adds them to the pool free list.
+iree_status_t iree_arena_block_pool_preallocate(
+ iree_arena_block_pool_t* block_pool, iree_host_size_t count);
+
// Trims the pool by freeing unused blocks back to the allocator.
// Acquired blocks are not freed and remain valid.
void iree_arena_block_pool_trim(iree_arena_block_pool_t* block_pool);