summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-04-03 10:45:11 +0100
committerAidan MacDonald <amachronic@protonmail.com>2022-09-19 15:09:51 -0400
commitecfec3e9bf9178299cb0fe64bd530a81e10b1142 (patch)
tree96f2edfb52e24a8f718b7a679970ba80eb495c08
parent88b21731fca0ef969e7759c03653421e2ca3aa22 (diff)
downloadrockbox-ecfec3e9bf9178299cb0fe64bd530a81e10b1142.tar.gz
rockbox-ecfec3e9bf9178299cb0fe64bd530a81e10b1142.zip
buflib: add handle_to_block_end
Change-Id: I598cf32bc8cd08ab4bca3827645e0a38b284468f
-rw-r--r--firmware/buflib.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/firmware/buflib.c b/firmware/buflib.c
index 52d52459a4..2a4b4b4f14 100644
--- a/firmware/buflib.c
+++ b/firmware/buflib.c
@@ -317,6 +317,20 @@ void handle_free(struct buflib_context *ctx, union buflib_data *handle)
317 ctx->compact = false; 317 ctx->compact = false;
318} 318}
319 319
320static inline
321union buflib_data* handle_to_block_end(struct buflib_context *ctx, int handle)
322{
323 void *ptr = buflib_get_data(ctx, handle);
324
325 /* this is a valid case for shrinking if handle
326 * was freed by the shrink callback */
327 if (!ptr)
328 return NULL;
329
330 union buflib_data *data = ALIGN_DOWN(ptr, sizeof(*data));
331 return data;
332}
333
320/* Get the start block of an allocation */ 334/* Get the start block of an allocation */
321static inline 335static inline
322union buflib_data* handle_to_block(struct buflib_context* ctx, int handle) 336union buflib_data* handle_to_block(struct buflib_context* ctx, int handle)
@@ -1038,7 +1052,7 @@ buflib_shrink(struct buflib_context* ctx, int handle, void* new_start, size_t ne
1038 1052
1039const char* buflib_get_name(struct buflib_context *ctx, int handle) 1053const char* buflib_get_name(struct buflib_context *ctx, int handle)
1040{ 1054{
1041 union buflib_data *data = ALIGN_DOWN(buflib_get_data(ctx, handle), sizeof (*data)); 1055 union buflib_data *data = handle_to_block_end(ctx, handle);
1042 size_t len = data[-bidx_BSIZE].val; 1056 size_t len = data[-bidx_BSIZE].val;
1043 if (len <= BUFLIB_NUM_FIELDS) 1057 if (len <= BUFLIB_NUM_FIELDS)
1044 return NULL; 1058 return NULL;