This is an automated email from the ASF dual-hosted git repository. nickva pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/couchdb-jiffy.git
commit 0e5c71c878f3774f98801c9201e6ab311ca88e41 Author: Nick Vatamaniuc <[email protected]> AuthorDate: Thu Apr 2 14:59:00 2026 -0400 Bump yielding reduction count to 4000 Also avoid using a division and a separate function call for bumping reductions. Instead make it static inline and use a multiplication instead. [1] It's the new value in OTP since 19.2. OTP commit: https://github.com/erlang/otp/commit/6bcdd45abd97134fddfb5b0307b1d256337b0c67 Doc mention: https://www.erlang.org/doc/apps/erts/erlang.html#bump_reductions/1 --- c_src/decoder.c | 4 +++- c_src/encoder.c | 4 +++- c_src/jiffy.h | 9 +++++++-- c_src/util.c | 6 ------ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/c_src/decoder.c b/c_src/decoder.c index 5021630..46239db 100644 --- a/c_src/decoder.c +++ b/c_src/decoder.c @@ -756,10 +756,12 @@ decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) start = d->i; + const size_t yt = yield_threshold(d->bytes_per_red); + while(d->i < bin.size) { bytes_processed = d->i - start; - if(should_yield(bytes_processed, d->bytes_per_red)) { + if(bytes_processed >= yt) { assert(enif_is_list(env, objs)); assert(enif_is_list(env, curr)); diff --git a/c_src/encoder.c b/c_src/encoder.c index 96f2c24..f331290 100644 --- a/c_src/encoder.c +++ b/c_src/encoder.c @@ -862,10 +862,12 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) start = e->iosize + e->i; + const size_t yt = yield_threshold(e->bytes_per_red); + while(!termstack_is_empty(&stack)) { bytes_processed = (e->iosize + e->i) - start; - if(should_yield(bytes_processed, e->bytes_per_red)) { + if(bytes_processed >= yt) { assert(enif_is_list(env, e->iolist)); diff --git a/c_src/jiffy.h b/c_src/jiffy.h index a0bcc28..19f8365 100644 --- a/c_src/jiffy.h +++ b/c_src/jiffy.h @@ -7,7 +7,10 @@ #include "erl_nif.h" #define DEFAULT_BYTES_PER_REDUCTION 20 -#define DEFAULT_ERLANG_REDUCTION_COUNT 2000 + +// This used to be 2000 and in 19.2 was bumped to 4000 +// #define CONTEXT_REDS in erts/emulator/beam/erl_vm.h +#define DEFAULT_ERLANG_REDUCTION_COUNT 4000 // Check for C99 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) @@ -57,7 +60,9 @@ ERL_NIF_TERM make_atom(ErlNifEnv* env, const char* name); int get_bytes_per_iter(ErlNifEnv* env, ERL_NIF_TERM val, size_t* bpi); int get_bytes_per_red(ErlNifEnv* env, ERL_NIF_TERM val, size_t* bpr); int get_null_term(ErlNifEnv* env, ERL_NIF_TERM val, ERL_NIF_TERM *null_term); -int should_yield(size_t used, size_t bytes_per_red); +static inline size_t yield_threshold(size_t bytes_per_red) { + return bytes_per_red * DEFAULT_ERLANG_REDUCTION_COUNT; +} void bump_used_reds(ErlNifEnv* env, size_t used, size_t bytes_per_red); ERL_NIF_TERM decode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); diff --git a/c_src/util.c b/c_src/util.c index 5df4fde..b1a0242 100644 --- a/c_src/util.c +++ b/c_src/util.c @@ -101,12 +101,6 @@ get_null_term(ErlNifEnv* env, ERL_NIF_TERM val, ERL_NIF_TERM *null_term) return 1; } -int -should_yield(size_t used, size_t bytes_per_red) -{ - return (used / bytes_per_red) >= DEFAULT_ERLANG_REDUCTION_COUNT; -} - void bump_used_reds(ErlNifEnv* env, size_t used, size_t bytes_per_red) {
