File 1340-erts-Avoid-unnecessary-yielding-when-cleaning-up-sig.patch of Package erlang

From e3f51d734da042e770028b2064f48d2e319641d7 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Wed, 6 Sep 2023 15:05:50 +0200
Subject: [PATCH] [erts] Avoid unnecessary yielding when cleaning up signals

---
 erts/emulator/beam/erl_proc_sig_queue.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/erts/emulator/beam/erl_proc_sig_queue.c b/erts/emulator/beam/erl_proc_sig_queue.c
index 83b6991809..2384a637d8 100644
--- a/erts/emulator/beam/erl_proc_sig_queue.c
+++ b/erts/emulator/beam/erl_proc_sig_queue.c
@@ -5827,6 +5827,7 @@ stretch_limit(Process *c_p, ErtsSigRecvTracing *tp,
 erts_proc_sig_handle_exit(Process *c_p, Sint *redsp,
                           ErtsProcExitContext *pe_ctxt_p)
 {
+    int yield = 0;
     int cnt;
     Sint limit;
     ErtsMessage *sig, ***next_nm_sig;
@@ -5969,12 +5970,11 @@ erts_proc_sig_handle_exit(Process *c_p, Sint *redsp,
             handle_sync_suspend(c_p, sig);
             break;
 
-        case ERTS_SIG_Q_OP_RPC: {
-            int yield = 0;
-            handle_rpc(c_p, (ErtsProcSigRPC *) sig,
-                       cnt, limit, &yield);
+        case ERTS_SIG_Q_OP_RPC:
+            yield = 0;
+            cnt += handle_rpc(c_p, (ErtsProcSigRPC *) sig,
+                              cnt, limit, &yield);
             break;
-        }
 
         case ERTS_SIG_Q_OP_DIST_SPAWN_REPLY: {
             cnt += handle_dist_spawn_reply_exiting(c_p, sig, pe_ctxt_p);
@@ -6013,7 +6013,7 @@ erts_proc_sig_handle_exit(Process *c_p, Sint *redsp,
             break;
         }
 
-    } while (cnt >= limit && *next_nm_sig);
+    } while (cnt <= limit && !yield && *next_nm_sig);
 
     *redsp += cnt / ERTS_SIG_REDS_CNT_FACTOR;
 
-- 
2.35.3

openSUSE Build Service is sponsored by