From f47aa584a8b447d8225fc5b09afb2d1fe6764c1d Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sun, 3 Apr 2022 10:48:14 +0100 Subject: buflib: add pin/unpin operation An allocation is pinned by calling buflib_pin() to up its pin count. The pin count is like a reference count: when above 0, buflib won't move the allocation and won't call its move callbacks. This makes it safe to hold the pointer returned by buflib_get_data() across yields or allocations. Note that pinned allocations can still shrink because there are some use cases where this would be valid, if buffer users coordinate with the shrink callback. Change-Id: I0d0c2a8ac7d891d3ad6b3d0eb80c5b5a1b4b9a9d --- firmware/core_alloc.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'firmware/core_alloc.c') diff --git a/firmware/core_alloc.c b/firmware/core_alloc.c index bf2f8e8298..0374c801c1 100644 --- a/firmware/core_alloc.c +++ b/firmware/core_alloc.c @@ -104,6 +104,21 @@ bool core_shrink(int handle, void* new_start, size_t new_size) return buflib_shrink(&core_ctx, handle, new_start, new_size); } +void core_pin(int handle) +{ + buflib_pin(&core_ctx, handle); +} + +void core_unpin(int handle) +{ + buflib_unpin(&core_ctx, handle); +} + +unsigned core_pin_count(int handle) +{ + return buflib_pin_count(&core_ctx, handle); +} + const char* core_get_name(int handle) { const char *name = buflib_get_name(&core_ctx, handle); -- cgit v1.2.3