diff options
Diffstat (limited to 'firmware/buflib.c')
-rw-r--r-- | firmware/buflib.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/firmware/buflib.c b/firmware/buflib.c index 1aa7404ece..4233bf9a61 100644 --- a/firmware/buflib.c +++ b/firmware/buflib.c | |||
@@ -724,7 +724,18 @@ buflib_alloc_maximum(struct buflib_context* ctx, const char* name, size_t *size, | |||
724 | /* limit name to 16 since that's what buflib_available() accounts for it */ | 724 | /* limit name to 16 since that's what buflib_available() accounts for it */ |
725 | char buf[16]; | 725 | char buf[16]; |
726 | 726 | ||
727 | *size = buflib_available(ctx); | 727 | /* ignore ctx->compact because it's true if all movable blocks are contiguous |
728 | * even if the buffer has holes due to unmovable allocations */ | ||
729 | unsigned hints; | ||
730 | size_t bufsize = ctx->handle_table - ctx->buf_start; | ||
731 | bufsize = MIN(BUFLIB_SHRINK_SIZE_MASK, bufsize*sizeof(union buflib_data)); /* make it bytes */ | ||
732 | /* try as hard as possible to free up space. allocations are | ||
733 | * welcome to give up some or all of their memory */ | ||
734 | hints = BUFLIB_SHRINK_POS_BACK | BUFLIB_SHRINK_POS_FRONT | bufsize; | ||
735 | /* compact until no space can be gained anymore */ | ||
736 | while (buflib_compact_and_shrink(ctx, hints)); | ||
737 | |||
738 | *size = buflib_allocatable(ctx); | ||
728 | if (*size <= 0) /* OOM */ | 739 | if (*size <= 0) /* OOM */ |
729 | return -1; | 740 | return -1; |
730 | 741 | ||