mdbx: несущественные доработки rkl.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-04-21 21:41:29 +03:00
parent a5af0c1a85
commit da9f78d2f6

View File

@ -48,44 +48,46 @@ void rkl_destructive_move(rkl_t *src, rkl_t *dst) {
dst->list_length = src->list_length; dst->list_length = src->list_length;
if (dst->list != dst->inplace) if (dst->list != dst->inplace)
osal_free(dst->list); osal_free(dst->list);
if (src->list_length > ARRAY_LENGTH(dst->inplace)) { if (src->list != src->inplace) {
assert(src->list != src->inplace);
dst->list = src->list; dst->list = src->list;
dst->list_limit = src->list_limit; dst->list_limit = src->list_limit;
} else { } else {
dst->list = dst->inplace; dst->list = dst->inplace;
dst->list_limit = ARRAY_LENGTH(src->inplace); dst->list_limit = ARRAY_LENGTH(src->inplace);
memcpy(dst->inplace, src->list, sizeof(dst->inplace)); memcpy(dst->inplace, src->list, sizeof(dst->inplace));
if (src->list != src->inplace)
osal_free(src->list);
} }
rkl_init(src); rkl_init(src);
} }
static int rkl_resize(rkl_t *rkl, size_t size) { static int rkl_resize(rkl_t *rkl, size_t wanna_size) {
assert(size > rkl->list_length); assert(wanna_size > rkl->list_length);
assert(rkl_check(rkl)); assert(rkl_check(rkl));
STATIC_ASSERT(txl_max < INT_MAX / sizeof(txnid_t)); STATIC_ASSERT(txl_max < INT_MAX / sizeof(txnid_t));
if (unlikely(size > txl_max)) { if (unlikely(wanna_size > txl_max)) {
ERROR("rkl too long (%zu >= %zu)", size, (size_t)txl_max); ERROR("rkl too long (%zu >= %zu)", wanna_size, (size_t)txl_max);
return MDBX_TXN_FULL; return MDBX_TXN_FULL;
} }
if (unlikely(size < rkl->list_length)) { if (unlikely(wanna_size < rkl->list_length)) {
ERROR("unable shrink rkl to %zu since length is %u", size, rkl->list_length); ERROR("unable shrink rkl to %zu since length is %u", wanna_size, rkl->list_length);
return MDBX_TXN_FULL; return MDBX_PROBLEM;
} }
if (unlikely(size <= ARRAY_LENGTH(rkl->inplace))) {
if (unlikely(wanna_size <= ARRAY_LENGTH(rkl->inplace))) {
if (rkl->list != 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); rkl->list_limit = ARRAY_LENGTH(rkl->inplace);
osal_free(rkl->list); osal_free(rkl->list);
rkl->list = rkl->inplace; rkl->list = rkl->inplace;
} else { } else {
assert(rkl->list_limit == ARRAY_LENGTH(rkl->inplace)); assert(rkl->list_limit == ARRAY_LENGTH(rkl->inplace));
} }
} else if (size != rkl->list_limit) { return MDBX_SUCCESS;
size_t bytes = rkl_size2bytes(size); }
void *const ptr = (rkl->list == rkl->inplace) ? osal_malloc(bytes) : osal_realloc(rkl->list, bytes);
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)) if (unlikely(!ptr))
return MDBX_ENOMEM; return MDBX_ENOMEM;
#ifdef osal_malloc_usable_size #ifdef osal_malloc_usable_size