From da9f78d2f62dafe1986dbfa555afaabf3a56e039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Mon, 21 Apr 2025 21:41:29 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=BD=D0=B5=D1=81=D1=83=D1=89=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B4=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20rkl.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rkl.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/rkl.c b/src/rkl.c index 54c79ab0..685fdc10 100644 --- a/src/rkl.c +++ b/src/rkl.c @@ -48,44 +48,46 @@ void rkl_destructive_move(rkl_t *src, rkl_t *dst) { dst->list_length = src->list_length; if (dst->list != dst->inplace) osal_free(dst->list); - if (src->list_length > ARRAY_LENGTH(dst->inplace)) { - assert(src->list != src->inplace); + if (src->list != src->inplace) { dst->list = src->list; dst->list_limit = src->list_limit; } else { dst->list = dst->inplace; dst->list_limit = ARRAY_LENGTH(src->inplace); memcpy(dst->inplace, src->list, sizeof(dst->inplace)); - if (src->list != src->inplace) - osal_free(src->list); } rkl_init(src); } -static int rkl_resize(rkl_t *rkl, size_t size) { - assert(size > rkl->list_length); +static int rkl_resize(rkl_t *rkl, size_t wanna_size) { + assert(wanna_size > rkl->list_length); assert(rkl_check(rkl)); STATIC_ASSERT(txl_max < INT_MAX / sizeof(txnid_t)); - if (unlikely(size > txl_max)) { - ERROR("rkl too long (%zu >= %zu)", size, (size_t)txl_max); + if (unlikely(wanna_size > txl_max)) { + ERROR("rkl too long (%zu >= %zu)", wanna_size, (size_t)txl_max); return MDBX_TXN_FULL; } - if (unlikely(size < rkl->list_length)) { - ERROR("unable shrink rkl to %zu since length is %u", size, rkl->list_length); - return MDBX_TXN_FULL; + if (unlikely(wanna_size < rkl->list_length)) { + ERROR("unable shrink rkl to %zu since length is %u", wanna_size, rkl->list_length); + return MDBX_PROBLEM; } - if (unlikely(size <= ARRAY_LENGTH(rkl->inplace))) { + + if (unlikely(wanna_size <= ARRAY_LENGTH(rkl->inplace))) { if (rkl->list != rkl->inplace) { - memcpy(rkl->inplace, rkl->list, sizeof(txnid_t) * rkl->list_length); + assert(rkl->list_limit > ARRAY_LENGTH(rkl->inplace) && rkl->list_length <= ARRAY_LENGTH(rkl->inplace)); + memcpy(rkl->inplace, rkl->list, sizeof(rkl->inplace)); rkl->list_limit = ARRAY_LENGTH(rkl->inplace); osal_free(rkl->list); rkl->list = rkl->inplace; } else { assert(rkl->list_limit == ARRAY_LENGTH(rkl->inplace)); } - } else if (size != rkl->list_limit) { - size_t bytes = rkl_size2bytes(size); - void *const ptr = (rkl->list == rkl->inplace) ? osal_malloc(bytes) : osal_realloc(rkl->list, bytes); + return MDBX_SUCCESS; + } + + if (wanna_size != rkl->list_limit) { + size_t bytes = rkl_size2bytes(wanna_size); + void *ptr = (rkl->list == rkl->inplace) ? osal_malloc(bytes) : osal_realloc(rkl->list, bytes); if (unlikely(!ptr)) return MDBX_ENOMEM; #ifdef osal_malloc_usable_size