mdbx: добавление rkl_destructive_merge() и унификация порядка dst/src аргументов rkl_merge().

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-06-03 17:11:40 +03:00
parent bb5b6c5823
commit 49a9545903
3 changed files with 10 additions and 3 deletions

View File

@ -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");

View File

@ -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) {

View File

@ -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 от остального кода, чем существенно его упрощает.