From d3ab33ab0041cd320796369d9e06a7bb8dcb831d Mon Sep 17 00:00:00 2001 From: Ulf Wiger Date: Wed, 29 Jul 2026 11:05:55 +0200 Subject: [PATCH 1/2] Address warnings for OTP 29, switch to using the 'peer' module --- .github/workflows/ci.yml | 2 +- src/gproc.erl | 2 +- src/gproc_lib.erl | 18 ++++++++++++------ src/gproc_pool.erl | 6 ++++-- test/gproc_test_lib.erl | 32 ++++++++++++++++++++++++-------- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e86150f..6941fa6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - otp: [21, 22, 23, 24, 25] + otp: [27, 28, 29] fail-fast: false container: image: erlang:${{ matrix.otp }} diff --git a/src/gproc.erl b/src/gproc.erl index c77afaa..c4beb7e 100644 --- a/src/gproc.erl +++ b/src/gproc.erl @@ -2282,7 +2282,7 @@ to_atom(S) -> gproc_info(Pid, Pat) -> Keys = ets:select(?TAB, [{ {{Pid,Pat}, '_'}, [], [{element,2, {element,1,'$_'}}] }]), - {?MODULE, lists:zf( + {?MODULE, lists:filtermap( fun(K) -> try V = get_value(K, Pid), {true, {K,V}} diff --git a/src/gproc_lib.erl b/src/gproc_lib.erl index e8ec626..9e42a86 100644 --- a/src/gproc_lib.erl +++ b/src/gproc_lib.erl @@ -133,7 +133,8 @@ maybe_scan(_, _, _, _, _) -> insert_attr({_,Scope,_} = Key, Attrs, Pid, Scope) when Scope==l; Scope==g -> - case ets:lookup(?TAB, K = {Pid, Key}) of + K = {Pid, Key}, + case ets:lookup(?TAB, K) of [{_, Attrs0}] when is_list(Attrs) -> As = proplists:get_value(attrs, Attrs0, []), As1 = lists:foldl(fun({K1,_} = Attr, Acc) -> @@ -487,16 +488,20 @@ unreg_opts(Key, Pid) -> end. remove_reg_1({c,_,_} = Key, Pid) -> - remove_counter_1(Key, ets:lookup_element(?TAB, Reg = {Key,Pid}, 3), Pid), + Reg = {Key,Pid}, + remove_counter_1(Key, ets:lookup_element(?TAB, Reg, 3), Pid), Reg; remove_reg_1({r,_,_} = Key, Pid) -> - remove_resource_1(Key, ets:lookup_element(?TAB, Reg = {Key,Pid}, 3), Pid), + Reg = {Key,Pid}, + remove_resource_1(Key, ets:lookup_element(?TAB, Reg, 3), Pid), Reg; remove_reg_1({T,_,_} = Key, _Pid) when T==a; T==n; T==rc -> - ets:delete(?TAB, Reg = {Key,T}), + Reg = {Key,T}, + ets:delete(?TAB, Reg), Reg; remove_reg_1({_,_,_} = Key, Pid) -> - ets:delete(?TAB, Reg = {Key, Pid}), + Reg = {Key, Pid}, + ets:delete(?TAB, Reg), Reg. remove_counter_1({c,C,N} = Key, Val, Pid) -> @@ -605,7 +610,8 @@ update_resource_count_(C, N, Val) -> end. resource_count_zero(C, N) -> - case ets:lookup(?TAB, {K = {rc,C,N},rc}) of + K = {rc,C,N}, + case ets:lookup(?TAB, {K, rc}) of [{_, Pid, _}] -> case get_attr(on_zero, Pid, K, undefined) of undefined -> ok; diff --git a/src/gproc_pool.erl b/src/gproc_pool.erl index adc6584..ca187cd 100644 --- a/src/gproc_pool.erl +++ b/src/gproc_pool.erl @@ -805,7 +805,8 @@ add_worker_(Pool, Name, Pos) -> Pos. reg_worker(Pool, Name, Pos) -> - gproc:reg_shared(Wrk = ?POOL_WRK(Pool, Name), 0), + Wrk = ?POOL_WRK(Pool, Name), + gproc:reg_shared(Wrk, 0), gproc:set_attributes_shared(Wrk, [{n, Pos}]). remove_worker_(Pool, Name) -> @@ -825,7 +826,8 @@ do_remove_worker_(Pool, Name) -> case AutoSize of false -> ok; true -> - case (NewLen = length(Ws1)) - length(Ws0) of + NewLen = length(Ws1), + case NewLen - length(Ws0) of 0 -> ok; Diff when Diff < 0 -> {_, Type} = gproc:get_value(K, shared), diff --git a/test/gproc_test_lib.erl b/test/gproc_test_lib.erl index 3cd1a16..c9a0bc3 100644 --- a/test/gproc_test_lib.erl +++ b/test/gproc_test_lib.erl @@ -46,11 +46,14 @@ start_node(Name0) -> {Name, _} = eunit_lib:split_node(Name0), ensure_dist(), {Pa, Pz} = paths(), - Paths = "-pa ./ -pz ../ebin" ++ - lists:flatten([[" -pa " ++ Path || Path <- Pa], - [" -pz " ++ Path || Path <- Pz]]), - Args = "-kernel prevent_overlapping_partitions false " ++ Paths, - {ok, Node} = slave:start(host(), Name, Args), + Paths = lists:append([["-pa", "./", "-pz", "../ebin"]] + ++ [["-pa", Path] || Path <- Pa] + ++ [["-pz", Path] || Path <- Pz]), + Args = ["-kernel", "prevent_overlapping_partitions", "false" | Paths], + {ok, Pid, Node} = peer:start(#{ name => Name + , host => host_string() + , args => Args }), + save_controlling_pid(Node, Pid), Node. stop_nodes(Ns) -> @@ -58,7 +61,20 @@ stop_nodes(Ns) -> ok. stop_node(N) -> - slave:stop(N). + Pid = get_controlling_pid(N), + try peer:stop(Pid) + after + delete_controlling_pid(N) + end. + +save_controlling_pid(Node, Pid) -> + persistent_term:put({?MODULE,peer_ref,Node}, Pid). + +get_controlling_pid(Node) -> + persistent_term:get({?MODULE, peer_ref, Node}). + +delete_controlling_pid(Node) -> + persistent_term:erase({?MODULE, peer_ref, Node}). paths() -> Path = code:get_path(), @@ -72,8 +88,8 @@ paths() -> {Pas, Pzs}. -host() -> - list_to_atom(host_string()). +%% host() -> +%% list_to_atom(host_string()). host_string() -> [_Name, Host] = re:split(atom_to_list(node()), "@", [{return, list}]), From 4ebc32a1be257ecb06ba68df67ba52072d6b8c52 Mon Sep 17 00:00:00 2001 From: Ulf Wiger Date: Wed, 29 Jul 2026 11:11:16 +0200 Subject: [PATCH 2/2] Bump minor gproc version to 1.3.0 --- ebin/gproc.app | 2 +- src/gproc.erl | 2 +- src/gproc_app.erl | 2 +- src/gproc_bcast.erl | 2 +- src/gproc_dist.erl | 2 +- src/gproc_info.erl | 2 +- src/gproc_init.erl | 2 +- src/gproc_lib.erl | 2 +- src/gproc_monitor.erl | 2 +- src/gproc_pool.erl | 2 +- src/gproc_ps.erl | 2 +- src/gproc_pt.erl | 2 +- src/gproc_sup.erl | 2 +- zomp.meta | 4 ++-- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ebin/gproc.app b/ebin/gproc.app index b039f9c..5ed38c7 100644 --- a/ebin/gproc.app +++ b/ebin/gproc.app @@ -3,7 +3,7 @@ {registered,[]}, {included_applications,[]}, {applications,[stdlib,kernel]}, - {vsn,"1.2.0"}, + {vsn,"1.3.0"}, {modules,[gproc_eqc_tests,gproc,gproc_app,gproc_bcast, gproc_dist,gproc_info,gproc_init,gproc_lib, gproc_monitor,gproc_pool,gproc_ps,gproc_pt,gproc_sup, diff --git a/src/gproc.erl b/src/gproc.erl index c4beb7e..730a9b7 100644 --- a/src/gproc.erl +++ b/src/gproc.erl @@ -45,7 +45,7 @@ %% @end -module(gproc). --vsn("1.2.0"). +-vsn("1.3.0"). -behaviour(gen_server). -export([start_link/0, diff --git a/src/gproc_app.erl b/src/gproc_app.erl index 3265e98..0a587da 100644 --- a/src/gproc_app.erl +++ b/src/gproc_app.erl @@ -19,7 +19,7 @@ %%%---------------------------------------------------------------------- -module(gproc_app). --vsn("1.2.0"). +-vsn("1.3.0"). -behaviour(application). diff --git a/src/gproc_bcast.erl b/src/gproc_bcast.erl index 90a2eb3..35902a5 100644 --- a/src/gproc_bcast.erl +++ b/src/gproc_bcast.erl @@ -27,7 +27,7 @@ %% @end -module(gproc_bcast). --vsn("1.2.0"). +-vsn("1.3.0"). -behaviour(gen_server). -export([start_link/0, diff --git a/src/gproc_dist.erl b/src/gproc_dist.erl index b23fc5c..8fe5c35 100644 --- a/src/gproc_dist.erl +++ b/src/gproc_dist.erl @@ -22,7 +22,7 @@ %%

For a detailed description, see gproc/doc/erlang07-wiger.pdf.

%% @end -module(gproc_dist). --vsn("1.2.0"). +-vsn("1.3.0"). %% -behaviour(gen_leader). % to avoid unnecessary warnings diff --git a/src/gproc_info.erl b/src/gproc_info.erl index db2aad2..cd7e190 100644 --- a/src/gproc_info.erl +++ b/src/gproc_info.erl @@ -22,7 +22,7 @@ %% @author Ulf Wiger %% -module(gproc_info). --vsn("1.2.0"). +-vsn("1.3.0"). -export([i/0]). diff --git a/src/gproc_init.erl b/src/gproc_init.erl index decbf5d..77e5bac 100644 --- a/src/gproc_init.erl +++ b/src/gproc_init.erl @@ -4,7 +4,7 @@ %%%---------------------------------------------------------------------- -module(gproc_init). --vsn("1.2.0"). +-vsn("1.3.0"). %% API -export([ diff --git a/src/gproc_lib.erl b/src/gproc_lib.erl index 9e42a86..faf94de 100644 --- a/src/gproc_lib.erl +++ b/src/gproc_lib.erl @@ -22,7 +22,7 @@ %%

For a detailed description, see gproc/doc/erlang07-wiger.pdf.

%% @end -module(gproc_lib). --vsn("1.2.0"). +-vsn("1.3.0"). -export([await/3, do_set_counter_value/3, diff --git a/src/gproc_monitor.erl b/src/gproc_monitor.erl index c689782..8e6cd6a 100644 --- a/src/gproc_monitor.erl +++ b/src/gproc_monitor.erl @@ -22,7 +22,7 @@ %% When a process subscribes to notifications for a given name, a message %% will be sent each time that name is registered -module(gproc_monitor). --vsn("1.2.0"). +-vsn("1.3.0"). -behaviour(gen_server). diff --git a/src/gproc_pool.erl b/src/gproc_pool.erl index ca187cd..a5dec00 100644 --- a/src/gproc_pool.erl +++ b/src/gproc_pool.erl @@ -53,7 +53,7 @@ %% jobs will not exceed the size of the pool. %% @end -module(gproc_pool). --vsn("1.2.0"). +-vsn("1.3.0"). -behavior(gen_server). %% gproc round-robin name lookup diff --git a/src/gproc_ps.erl b/src/gproc_ps.erl index a38d90d..7a206f7 100644 --- a/src/gproc_ps.erl +++ b/src/gproc_ps.erl @@ -35,7 +35,7 @@ %% @type status() = 1 | 0. %% @end -module(gproc_ps). --vsn("1.2.0"). +-vsn("1.3.0"). -export([subscribe/2, subscribe_cond/3, diff --git a/src/gproc_pt.erl b/src/gproc_pt.erl index 591dc27..d002067 100644 --- a/src/gproc_pt.erl +++ b/src/gproc_pt.erl @@ -38,7 +38,7 @@ %% @end %% -module(gproc_pt). --vsn("1.2.0"). +-vsn("1.3.0"). -export([parse_transform/2]). diff --git a/src/gproc_sup.erl b/src/gproc_sup.erl index a9708e5..3178613 100644 --- a/src/gproc_sup.erl +++ b/src/gproc_sup.erl @@ -20,7 +20,7 @@ %%---------------------------------------------------------------------- -module(gproc_sup). --vsn("1.2.0"). +-vsn("1.3.0"). -behaviour(supervisor). diff --git a/zomp.meta b/zomp.meta index 66c0c4f..611226b 100644 --- a/zomp.meta +++ b/zomp.meta @@ -1,10 +1,10 @@ {name,"gproc"}. {type,app}. {modules,[]}. -{author,"Ulf Wiger"}. {prefix,"gproc"}. +{author,"Ulf Wiger"}. {desc,"Extended process registry for Erlang"}. -{package_id,{"uwiger","gproc",{1,2,0}}}. +{package_id,{"uwiger","gproc",{1,3,0}}}. {deps,[]}. {key_name,none}. {a_email,"ulf@wiger.net"}.