File 2911-global-module-optimizations.patch of Package erlang

From c919ba47b2799b7fd9882d75c3c6956a3cd5344f Mon Sep 17 00:00:00 2001
From: Maria Scott <maria-12648430@hnc-agency.org>
Date: Wed, 29 Oct 2025 09:40:07 +0100
Subject: [PATCH] `global` module optimizations

---
 lib/kernel/src/global.erl | 36 +++++++++++++++---------------------
 1 file changed, 15 insertions(+), 21 deletions(-)

diff --git a/lib/kernel/src/global.erl b/lib/kernel/src/global.erl
index d0d53dc910..9412c538c1 100644
--- a/lib/kernel/src/global.erl
+++ b/lib/kernel/src/global.erl
@@ -1677,13 +1677,12 @@ save_node_resource_info(Node, Mon) ->
     ok.
 
 delete_node_resource_info(Mon) ->
-    case ets:lookup(global_node_resources, Mon) of
+    case ets:take(global_node_resources, Mon) of
         [] ->
             ok;
         [{Mon, Node}] ->
             [{Node, OldRes}] = ets:lookup(global_node_resources, Node),
             NewRes = maps:remove(Mon, OldRes),
-            true = ets:delete(global_node_resources, Mon),
             case maps:size(NewRes) of
                 0 ->
                     true = ets:delete(global_node_resources, Node),
@@ -1695,11 +1694,10 @@ delete_node_resource_info(Mon) ->
     end.
 
 delete_node_resources(Node, #state{} = State) ->
-    case ets:lookup(global_node_resources, Node) of
+    case ets:take(global_node_resources, Node) of
         [] ->
             State;
         [{Node, Resources}] ->
-            true = ets:delete(global_node_resources, Node),
             maps:fold(fun (Mon, ok, AccS0) ->
                               erlang:demonitor(Mon, [flush]),
                               true = ets:delete(global_node_resources, Mon),
@@ -2145,13 +2143,13 @@ remove_lock(ResourceId, LockRequesterId, Pid, [{Pid,Ref}], Down, S0) ->
                   [{ResourceId, LockRequesterId}, Pid]);
 remove_lock(ResourceId, LockRequesterId, Pid, PidRefs0, _Down, S) ->
     ?trace({remove_lock_2, {id,ResourceId},{pid,Pid}}),
-    PidRefs = case lists:keyfind(Pid, 1, PidRefs0) of
-                  {Pid, Ref} ->
+    PidRefs = case lists:keytake(Pid, 1, PidRefs0) of
+		  {value, {Pid, Ref}, PidRefs1} ->
                       delete_node_resource_info(Ref),
                       true = erlang:demonitor(Ref, [flush]),
                       true = ets:delete_object(global_pid_ids, 
                                                {Ref, ResourceId}),
-                      lists:keydelete(Pid, 1, PidRefs0);
+                      PidRefs1;
                   false ->
                       PidRefs0
               end,
@@ -2290,9 +2288,8 @@ delete_global_name_keep_pid(Name, S) ->
     end.
 
 delete_global_name2(Name, S) ->
-    case ets:lookup(global_names, Name) of
+    case ets:take(global_names, Name) of
         [{Name, Pid, _Method, Ref}] ->
-            true = ets:delete(global_names, Name),
             delete_global_name2(Name, Pid, Ref, S);
         [] ->
             S
@@ -2305,9 +2302,8 @@ delete_global_name2(Name, Pid, Ref, S) ->
     ?trace({delete_global_name,{item,Name},{pid,Pid}}),
     true = ets:delete_object(global_pid_names, {Pid, Name}),
     true = ets:delete_object(global_pid_names, {Ref, Name}),
-    case ets:lookup(global_names_ext, Name) of
+    case ets:take(global_names_ext, Name) of
 	[{Name, Pid, RegNode}] ->
-            true = ets:delete(global_names_ext, Name),
             ?trace({delete_global_name, {name,Name,{pid,Pid},{RegNode,Pid}}}),
 	    dounlink_ext(Pid, RegNode);
 	[] ->
@@ -2787,12 +2783,12 @@ cancel_locker(Node, S, Tag, ToBeRunOnLockerF) ->
     ?trace({cancel_locker, {node,Node},{tag,Tag},
             {sync_tag_my, get({sync_tag_my, Node})},{resolvers,Resolvers}}),
     send_cancel_connect(Node, Tag, S),
-    case lists:keyfind(Node, 1, Resolvers) of
-	{_, Tag, Resolver} ->
+    case lists:keytake(Node, 1, Resolvers) of
+	{value, {_, Tag, Resolver}, Resolvers1} ->
             ?trace({{resolver, Resolver}}),
             exit(Resolver, kill),
             S1 = trace_message(S, {kill_resolver, Node}, [Tag, Resolver]),
-	    S1#state{resolvers = lists:keydelete(Node, 1, Resolvers)};
+	    S1#state{resolvers = Resolvers1};
 	_ ->
 	    S
     end.
@@ -2964,7 +2960,7 @@ unlink_pid(Pid) ->
     end.
 
 pid_is_locking(Pid, PidRefs) ->
-    lists:keyfind(Pid, 1, PidRefs) =/= false.
+    lists:keymember(Pid, 1, PidRefs).
 
 delete_lock(Ref, S0) ->
     Locks = pid_locks(Ref),
@@ -2975,14 +2971,12 @@ delete_lock(Ref, S0) ->
     lists:foldl(F, S0, Locks).
 
 pid_locks(Ref) ->
-    L = lists:flatmap(fun({_, ResourceId}) ->
-                              ets:lookup(global_locks, ResourceId)
-                      end, ets:lookup(global_pid_ids, Ref)),
-    [Lock || Lock = {_Id, _Req, PidRefs} <- L, 
-             ref_is_locking(Ref, PidRefs)].
+    [Lock || {_, ResourceId} <- ets:lookup(global_pid_ids, Ref),
+	     Lock = {_, _, PidRefs} <- ets:lookup(global_locks, ResourceId),
+	     ref_is_locking(Ref, PidRefs)].
 
 ref_is_locking(Ref, PidRefs) ->
-    lists:keyfind(Ref, 2, PidRefs) =/= false.                                  
+    lists:keymember(Ref, 2, PidRefs).                                  
 
 handle_nodeup(Node, #state{the_locker = TheLocker,
                            resolvers = Rs,
-- 
2.51.0

openSUSE Build Service is sponsored by