mirror of
https://github.com/isar/libmdbx.git
synced 2025-10-05 00:42:20 +08:00
mdbx: add MDBX_opt_txn_dp_initial
& MDBX_opt_txn_dp_limit
.
More for https://github.com/erthink/libmdbx/issues/128 Change-Id: I4be3c7476e9ce16ed4f27691d0df653552930e3c
This commit is contained in:
48
src/core.c
48
src/core.c
@@ -19787,6 +19787,47 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
|
||||
env->me_options.rp_augment_limit = (unsigned)value;
|
||||
break;
|
||||
|
||||
case MDBX_opt_txn_dp_limit:
|
||||
case MDBX_opt_txn_dp_initial:
|
||||
if (unlikely(value > MDBX_PGL_LIMIT))
|
||||
return MDBX_EINVAL;
|
||||
if (unlikely(env->me_txn0 == NULL))
|
||||
return MDBX_EACCESS;
|
||||
if (lock_needed) {
|
||||
err = mdbx_txn_lock(env, false);
|
||||
if (unlikely(err != MDBX_SUCCESS))
|
||||
return err;
|
||||
should_unlock = true;
|
||||
}
|
||||
if (env->me_txn)
|
||||
err = MDBX_EPERM /* unable change during transaction */;
|
||||
else {
|
||||
mdbx_dpl_clear(env->me_txn0->tw.dirtylist);
|
||||
const unsigned value32 = (unsigned)value;
|
||||
if (option == MDBX_opt_txn_dp_initial &&
|
||||
env->me_options.dp_initial != value32) {
|
||||
if (env->me_options.dp_limit < value32)
|
||||
env->me_options.dp_limit = value32;
|
||||
if (env->me_txn0->tw.dirtylist->allocated < value32 &&
|
||||
!mdbx_dpl_reserve(env->me_txn0, value32))
|
||||
err = MDBX_ENOMEM;
|
||||
else
|
||||
env->me_options.dp_initial = value32;
|
||||
}
|
||||
if (option == MDBX_opt_txn_dp_limit &&
|
||||
env->me_options.dp_limit != value32) {
|
||||
if (env->me_txn0->tw.dirtylist->allocated > value32 &&
|
||||
!mdbx_dpl_reserve(env->me_txn0, value32))
|
||||
err = MDBX_ENOMEM;
|
||||
else {
|
||||
if (env->me_options.dp_initial > value32)
|
||||
env->me_options.dp_initial = value32;
|
||||
env->me_options.dp_limit = value32;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return MDBX_EINVAL;
|
||||
}
|
||||
@@ -19833,6 +19874,13 @@ __cold int mdbx_env_get_option(const MDBX_env *env, const MDBX_option_t option,
|
||||
*value = env->me_options.rp_augment_limit;
|
||||
break;
|
||||
|
||||
case MDBX_opt_txn_dp_limit:
|
||||
*value = env->me_options.dp_limit;
|
||||
break;
|
||||
case MDBX_opt_txn_dp_initial:
|
||||
*value = env->me_options.dp_initial;
|
||||
break;
|
||||
|
||||
default:
|
||||
return MDBX_EINVAL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user