File 2836-Use-ets-lookup_element-when-possible.patch of Package erlang

From 05a6131d90da7a73e6529e72e5a6f5a7e715a54c Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Sun, 16 Feb 2020 01:24:50 +0100
Subject: [PATCH 6/6] Use ets:lookup_element when possible

Micro optimization to create less garbage from ets lookups
---
 lib/kernel/src/inet_db.erl | 103 +++++++++++++++++++++++----------------------
 1 file changed, 52 insertions(+), 51 deletions(-)

diff --git a/lib/kernel/src/inet_db.erl b/lib/kernel/src/inet_db.erl
index 491cb9c8d0..fbccc787a2 100644
--- a/lib/kernel/src/inet_db.erl
+++ b/lib/kernel/src/inet_db.erl
@@ -515,9 +515,8 @@ res_update(Option, TagTm) ->
     end.
 
 db_get(Name) ->
-    case ets:lookup(inet_db, Name) of
-	[] -> undefined;
-	[{_,Val}] -> Val
+    try ets:lookup_element(inet_db, Name, 2)
+    catch error:badarg -> undefined
     end.
 
 add_rr(RR) ->
@@ -839,29 +838,31 @@ init([]) ->
 		cache_timer = init_timer() }}.
 
 reset_db(Db) ->
-    ets:insert(Db, {hostname, []}),
-    ets:insert(Db, {res_ns, []}),
-    ets:insert(Db, {res_alt_ns, []}),
-    ets:insert(Db, {res_search, []}),
-    ets:insert(Db, {res_domain, ""}),
-    ets:insert(Db, {res_lookup, []}),
-    ets:insert(Db, {res_recurse, true}),
-    ets:insert(Db, {res_usevc, false}),
-    ets:insert(Db, {res_id, 0}),
-    ets:insert(Db, {res_retry, ?RES_RETRY}),
-    ets:insert(Db, {res_timeout, ?RES_TIMEOUT}),
-    ets:insert(Db, {res_inet6, false}),
-    ets:insert(Db, {res_edns, false}),
-    ets:insert(Db, {res_udp_payload_size, ?DNS_UDP_PAYLOAD_SIZE}),
-    ets:insert(Db, {cache_size, ?CACHE_LIMIT}),
-    ets:insert(Db, {cache_refresh_interval,?CACHE_REFRESH}),
-    ets:insert(Db, {socks5_server, ""}),
-    ets:insert(Db, {socks5_port, ?IPPORT_SOCKS}),
-    ets:insert(Db, {socks5_methods, [none]}),
-    ets:insert(Db, {socks5_noproxy, []}),
-    ets:insert(Db, {tcp_module,  ?DEFAULT_TCP_MODULE}),
-    ets:insert(Db, {udp_module,  ?DEFAULT_UDP_MODULE}),
-    ets:insert(Db, {sctp_module, ?DEFAULT_SCTP_MODULE}).
+    ets:insert(
+      Db,
+      [{hostname, []},
+       {res_ns, []},
+       {res_alt_ns, []},
+       {res_search, []},
+       {res_domain, ""},
+       {res_lookup, []},
+       {res_recurse, true},
+       {res_usevc, false},
+       {res_id, 0},
+       {res_retry, ?RES_RETRY},
+       {res_timeout, ?RES_TIMEOUT},
+       {res_inet6, false},
+       {res_edns, false},
+       {res_udp_payload_size, ?DNS_UDP_PAYLOAD_SIZE},
+       {cache_size, ?CACHE_LIMIT},
+       {cache_refresh_interval,?CACHE_REFRESH},
+       {socks5_server, ""},
+       {socks5_port, ?IPPORT_SOCKS},
+       {socks5_methods, [none]},
+       {socks5_noproxy, []},
+       {tcp_module,  ?DEFAULT_TCP_MODULE},
+       {udp_module,  ?DEFAULT_UDP_MODULE},
+       {sctp_module, ?DEFAULT_SCTP_MODULE}]).
 
 %%----------------------------------------------------------------------
 %% Func: handle_call/3
@@ -925,7 +926,7 @@ handle_call(Request, From, #state{db=Db}=State) ->
 	    case res_check_option(Opt, El) of
 		true ->
 		    Optname = res_optname(Opt),
-		    [{_,Es}] = ets:lookup(Db, Optname),
+		    Es = ets:lookup_element(Db, Optname, 2),
 		    NewEs = case Op of
 				ins -> [E | lists_delete(E, Es)];
 				add -> lists_delete(E, Es) ++ El;
@@ -1031,13 +1032,13 @@ handle_call(Request, From, #state{db=Db}=State) ->
 	    {reply, ok, State};
 
 	{add_socks_methods, Ls} -> 
-	    [{_,As}] = ets:lookup(Db, socks5_methods),
+	    As = ets:lookup_element(Db, socks5_methods, 2),
 	    As1 = lists_subtract(As, Ls),
 	    ets:insert(Db, {socks5_methods, As1 ++ Ls}),
 	    {reply, ok, State};
 	    
 	{del_socks_methods, Ls} ->
-	    [{_,As}] = ets:lookup(Db, socks5_methods),
+	    As = ets:lookup_element(Db, socks5_methods, 2),
 	    As1 = lists_subtract(As, Ls),
 	    case lists:member(none, As1) of
 		false -> ets:insert(Db, {socks5_methods, As1 ++ [none]});
@@ -1051,12 +1052,12 @@ handle_call(Request, From, #state{db=Db}=State) ->
 
 	{add_socks_noproxy, {{A,B,C,D},{MA,MB,MC,MD}}} 
 	when ?ip(A,B,C,D), ?ip(MA,MB,MC,MD) ->
-	    [{_,As}] = ets:lookup(Db, socks5_noproxy),
+	    As = ets:lookup_element(Db, socks5_noproxy, 2),
 	    ets:insert(Db, {socks5_noproxy, As++[{{A,B,C,D},{MA,MB,MC,MD}}]}),
 	    {reply, ok, State};
 
 	{del_socks_noproxy, {A,B,C,D}=IP} when ?ip(A,B,C,D) ->
-	    [{_,As}] = ets:lookup(Db, socks5_noproxy),
+	    As = ets:lookup_element(Db, socks5_noproxy, 2),
 	    ets:insert(Db, {socks5_noproxy, lists_keydelete(IP, 1, As)}),
 	    {reply, ok, State};
 
@@ -1156,19 +1157,19 @@ handle_set_file(
     %%
     %% Maybe update file content
     %%
-    case ets:lookup(Db, TagTm) of
-        [] ->
-            %% Option no longer set - ignore update
-            {reply, ok, State};
-        [{_, Tm}] ->
+    try ets:lookup_element(Db, TagTm, 2) of
+        Tm ->
             %% Current update request
-            [{_, File}] = ets:lookup(Db, res_optname(Option)),
-            [{_, Finfo}] = ets:lookup(Db, TagInfo),
+            File = ets:lookup_element(Db, res_optname(Option), 2),
+            Finfo = ets:lookup_element(Db, TagInfo, 2),
             handle_update_file(
               Finfo, File, TagTm, TagInfo, ParseFun, From, State);
-        [_] ->
+        _ ->
             %% Late request - ignore update
             {reply, ok, State}
+    catch error:badarg ->
+            %% Option no longer set - ignore update
+            {reply, ok, State}
     end;
 handle_set_file(
   Option, Fname, TagTm, TagInfo, ParseFun, From, #state{db=Db}=State) ->
@@ -1237,8 +1238,8 @@ do_add_host(Byname, Byaddr, Names, Type, IP) ->
     Nms = [tolower(Nm) || Nm <- Names],
     add_ip_bynms(Byname, Type, IP, Nms, Names),
     Key = {Type, IP},
-    case ets:lookup(Byaddr, Key) of
-        [{_Key, Names_0}] ->
+    try ets:lookup_element(Byaddr, Key, 2) of
+        Names_0 ->
             %% Delete IP address from byname entries
             NmsSet = % Set of new tolower(Name)s
                 lists:foldl(
@@ -1248,8 +1249,8 @@ do_add_host(Byname, Byaddr, Names, Type, IP) ->
             del_ip_bynms(
               Byname, Type, IP,
               [Nm || Nm <- [tolower(Name) || Name <- Names_0],
-                     not maps:is_key(Nm, NmsSet)]);
-        [] ->
+                     not maps:is_key(Nm, NmsSet)])
+    catch error:badarg ->
             ok
     end,
     %% Replace the entry in the byaddr table
@@ -1259,16 +1260,16 @@ do_add_host(Byname, Byaddr, Names, Type, IP) ->
 do_del_host(Byname, Byaddr, IP) ->
     Fam = inet_family(IP),
     Key = {Fam, IP},
-    case ets:lookup(Byaddr, Key) of
-        [{_Key, Names}] ->
+    try ets:lookup_element(Byaddr, Key, 2) of
+        Names ->
             %% Delete IP address from byname entries
             del_ip_bynms(
               Byname, Fam, IP,
               [tolower(Name) || Name <- Names]),
             %% Delete from byaddr table
             true = ets:delete(Byaddr, Key),
-            ok;
-        [] ->
+            ok
+    catch error:badarg ->
             ok
     end.
 
@@ -1690,12 +1691,12 @@ do_refresh_cache(Key, CacheDb, Now, OldestT) ->
 %% -------------------------------------------------------------------
 alloc_entry(Db, CacheDb, TM) ->
     CurSize = ets:info(CacheDb, size),
-    case ets:lookup(Db, cache_size) of
-	[{cache_size, Size}] when Size =< CurSize, Size > 0 ->
+    case ets:lookup_element(Db, cache_size, 2) of
+	Size when Size =< CurSize, Size > 0 ->
 	    alloc_entry(CacheDb, CurSize, TM, trunc(Size * 0.1) + 1);
-	[{cache_size, Size}] when Size =< 0 ->
+	Size when Size =< 0 ->
 	    false;
-	_ ->
+	_Size ->
 	    true
     end.
 
-- 
2.16.4

openSUSE Build Service is sponsored by