File 2981-Added-gen_server-multi_call-optimisation-for-single-.patch of Package erlang

From a93dd2d93332228e4b8acdedd755c9fcf8f07d65 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Smyczy=C5=84ski?= <s.smyczynski@simplito.com>
Date: Fri, 27 Nov 2020 01:20:43 +0100
Subject: [PATCH] Added gen_server:multi_call optimisation for single local
 node case. The optimisation is only needed in infinity timeout case.

---
 lib/stdlib/src/gen_server.erl | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lib/stdlib/src/gen_server.erl b/lib/stdlib/src/gen_server.erl
index e49961a5f0..3638027d4f 100644
--- a/lib/stdlib/src/gen_server.erl
+++ b/lib/stdlib/src/gen_server.erl
@@ -428,6 +428,15 @@ do_send(Dest, Msg) ->
 	    Other
     end.
 
+do_multi_call([Node], Name, Req, infinity) when Node =:= node() ->
+    % Special case when multi_call is used with local node only.
+    % In that case we can leverage the benefit of recv_mark optimisation
+    % existing in simple gen:call.
+    try gen:call(Name, '$gen_call', Req, infinity) of
+        {ok, Res} -> {[{Node, Res}],[]}
+    catch exit:_ ->
+        {[], [Node]}
+    end;
 do_multi_call(Nodes, Name, Req, infinity) ->
     Tag = make_ref(),
     Monitors = send_nodes(Nodes, Name, Tag, Req),
-- 
2.26.2

openSUSE Build Service is sponsored by