sys:get_status kills gen_servers registered globally with something other than an atom
Paul Hampson
PaulH@REDACTED
Fri Apr 30 08:13:05 CEST 2010
Using Erlang R13B04, I'm creating gen_servers with gen_server:start( { global, "Name" } ). This is valid according to the gen_server manpage, which states GlobalName is term().
However, if I call sys:get_status({global, "Name"}) (or sys_get:status( global:whereis_name( "Name" ) ) to rule out the name lookup as an issue) the gen_server dies, with:
exception error: no true branch found when evaluating an if expression
in function gen_server:format_status/2
in call from sys:get_status/5
in call from sys:do_cmd/6
in call from sys:handle_system_msg/8
This is because of the following code in gen_server:format_status:
NameTag = if is_pid(Name) ->
pid_to_list(Name);
is_atom(Name) ->
Name
end,
Header = lists:concat(["Status for generic server ", NameTag]),
Which fails to handle that Name (which is stripped of {global,} in gen_server:name/1 or gen_server:get_proc_name/1) may be something other than an atom or pid.
Interestingly, the comment above gen_server:start/3 indicates that the supplied server name is { global, atom() }, not { global, term() } as per the documentation.
So either the documentation is wrong, or the gen_server implementation/comment is wrong.
Bizarrely, I'm sure I was able to use sys:get_status against these same gen_servers a month ago, which would have been R13B03 or maybe an B13B03, but erlang/otp on github doesn't indicate any relevant changes.
--
Paul "TBBle" Hampson
Project: Find out what makes things tick
Plan: Stop the ticking...
More information about the erlang-bugs
mailing list