From 84fa4b8d1bb38ebc503afaf585baad6fa736c818 Mon Sep 17 00:00:00 2001 From: Glenn Strauss Date: Mon, 14 Jun 2021 05:12:14 -0400 Subject: [PATCH] [core] buffer_realloc() using power-2 realloc --- src/buffer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/buffer.c b/src/buffer.c index e765b194..776c7c75 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -60,8 +60,13 @@ __attribute_nonnull__ __attribute_returns_nonnull__ static char* buffer_realloc(buffer * const restrict b, const size_t len) { #define BUFFER_PIECE_SIZE 64uL /*(must be power-of-2)*/ - const size_t sz = (len + 1 + BUFFER_PIECE_SIZE-1) & ~(BUFFER_PIECE_SIZE-1); + size_t sz = (len + 1 + BUFFER_PIECE_SIZE-1) & ~(BUFFER_PIECE_SIZE-1); force_assert(sz > len); + if ((sz & (sz-1)) && sz < INT_MAX) {/* not power-2; huge val not expected */ + /*(optimizer should recognize this and use ffs or clz or equivalent)*/ + const size_t psz = sz; + for (sz = 256; sz < psz; sz <<= 1) ; + } b->size = sz; b->ptr = realloc(b->ptr, sz);