From 97da9c78a8951898aa54a0e8eb08a0353b7e7e56 Mon Sep 17 00:00:00 2001 From: Peter M Date: Sun, 8 Mar 2026 18:04:05 +0100 Subject: [PATCH] Fix: benign gen_server start race crash reports This typically happens, due to timer_manager startup race for say: :erlang.send_after(1, self(), :show_hello) :erlang.send_after(5000, self(), :show_cat) Avoid emitting a crash report in gen_server:init_it/5 when erlang:register/2 loses a race to another process and whereis(Name) returns an existing pid. This keeps {error, {already_started, Pid}} behavior unchanged for callers, while preserving crash reports for genuine registration failures where the name is still undefined. Signed-off-by: Peter M --- libs/estdlib/src/gen_server.erl | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/libs/estdlib/src/gen_server.erl b/libs/estdlib/src/gen_server.erl index abdc604671..e92ccac0c9 100644 --- a/libs/estdlib/src/gen_server.erl +++ b/libs/estdlib/src/gen_server.erl @@ -125,22 +125,22 @@ init_it(Starter, Name, Module, Args, Options) -> init_it(Starter, Module, Args, Options) catch error:badarg:S -> - ErrorT = - case whereis(Name) of - undefined -> - badarg; - Pid when is_pid(Pid) -> - {already_started, Pid} - end, - crash_report( - io_lib:format("gen_server:init_it/5: Error initializing module ~p under name ~p", [ - Module, Name - ]), - Starter, - ErrorT, - S - ), - proc_lib:init_ack(Starter, {error, ErrorT}) + case whereis(Name) of + undefined -> + crash_report( + io_lib:format( + "gen_server:init_it/5: Error initializing module ~p under name ~p", [ + Module, Name + ] + ), + Starter, + badarg, + S + ), + proc_lib:init_ack(Starter, {error, badarg}); + Pid when is_pid(Pid) -> + proc_lib:init_ack(Starter, {error, {already_started, Pid}}) + end end. init_it(Starter, Module, Args, Options) ->