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

Reply via email to