From 49a954590346babfa42a78115f2fea638039323a 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: Tue, 3 Jun 2025 17:11:40 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20`rkl=5Fdestructive=5Fmerge()`=20?= =?UTF-8?q?=D0=B8=20=D1=83=D0=BD=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BA=D0=B0=20dst/src?= =?UTF-8?q?=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20`rkl=5Fmerge()`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gc-put.c | 2 +- src/rkl.c | 8 +++++++- src/rkl.h | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gc-put.c b/src/gc-put.c index fa141968..0a4066d5 100644 --- a/src/gc-put.c +++ b/src/gc-put.c @@ -1195,7 +1195,7 @@ static int gc_rerere(MDBX_txn *txn, gcu_t *ctx) { return err; if (!rkl_empty(&ctx->sequel)) { - err = rkl_merge(&ctx->ready4reuse, &ctx->sequel, false); + err = rkl_merge(&ctx->sequel, &ctx->ready4reuse, false); if (unlikely(err != MDBX_SUCCESS)) { if (err == MDBX_RESULT_TRUE) { ERROR("%s/%d: %s", "MDBX_PROBLEM", MDBX_PROBLEM, "unexpected duplicate(s) during rkl-merge"); diff --git a/src/rkl.c b/src/rkl.c index 1a0fd84b..4de9fd75 100644 --- a/src/rkl.c +++ b/src/rkl.c @@ -393,7 +393,7 @@ txnid_t rkl_highest(const rkl_t *rkl) { return !solid_empty(rkl) ? rkl->solid_end - 1 : 0; } -int rkl_merge(rkl_t *dst, const rkl_t *src, bool ignore_duplicates) { +int rkl_merge(const rkl_t *src, rkl_t *dst, bool ignore_duplicates) { if (src->list_length) { size_t i = src->list_length; do { @@ -413,6 +413,12 @@ int rkl_merge(rkl_t *dst, const rkl_t *src, bool ignore_duplicates) { return MDBX_SUCCESS; } +int rkl_destructive_merge(rkl_t *src, rkl_t *dst, bool ignore_duplicates) { + int err = rkl_merge(src, dst, ignore_duplicates); + rkl_destroy(src); + return err; +} + rkl_iter_t rkl_iterator(const rkl_t *rkl, const bool reverse) { rkl_iter_t iter = {.rkl = rkl, .pos = reverse ? rkl_len(rkl) : 0, .solid_offset = 0}; if (!solid_empty(rkl) && rkl->list_length) { diff --git a/src/rkl.h b/src/rkl.h index e982d8c8..a9c98ab0 100644 --- a/src/rkl.h +++ b/src/rkl.h @@ -50,7 +50,8 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline txnid_t rkl_edge(cons } MDBX_MAYBE_UNUSED MDBX_INTERNAL __must_check_result int rkl_push(rkl_t *rkl, const txnid_t id); MDBX_MAYBE_UNUSED MDBX_INTERNAL txnid_t rkl_pop(rkl_t *rkl, const bool highest_not_lowest); -MDBX_MAYBE_UNUSED MDBX_INTERNAL __must_check_result int rkl_merge(rkl_t *dst, const rkl_t *src, bool ignore_duplicates); +MDBX_MAYBE_UNUSED MDBX_INTERNAL __must_check_result int rkl_merge(const rkl_t *src, rkl_t *dst, bool ignore_duplicates); +MDBX_MAYBE_UNUSED MDBX_INTERNAL int rkl_destructive_merge(rkl_t *src, rkl_t *dst, bool ignore_duplicates); /* Итератор для rkl. * Обеспечивает изоляцию внутреннего устройства rkl от остального кода, чем существенно его упрощает.