Packages

otpbp

6.14.0
7.18.0 7.16.1 7.15.0 7.14.0 7.13.0 7.12.0 7.11.0 7.10.2 7.9.3 7.9.2 7.9.1 7.8.7 7.8.6 7.8.5 7.8.4 7.7.1 7.7.0 7.6.3 7.6.2 7.6.1 7.6.0 7.5.1 7.5.0 7.4.0 7.3.4 7.3.3 7.3.2 7.3.1 7.3.0 7.2.0 7.1.1 7.1.0 7.0.4 7.0.3 7.0.2 7.0.1 6.26.0 6.25.0 6.24.0 6.23.0 6.22.2 6.21.3 6.21.2 6.21.1 6.20.2 6.19.1 6.19.0 6.18.3 6.18.2 6.18.1 6.18.0 6.17.1 6.17.0 6.16.0 6.15.4 6.15.3 6.15.2 6.15.1 6.15.0 6.14.0 6.13.5 6.13.4 6.13.3 6.13.2 6.13.1 6.13.0 6.12.0 6.11.2 6.11.1 6.10.0 6.9.2 6.9.1 6.9.0 6.8.0 6.7.1 6.7.0 6.6.4 6.6.3 6.6.2 6.6.1 6.6.0 6.5.0 6.4.0 6.3.3 6.3.2 6.3.1 6.3.0 6.2.1 6.2.0 6.1.0 6.0.0 5.39.0 5.38.0 5.37.0 5.36.0 5.35.2 5.34.3 5.34.2 5.34.1 5.33.1 5.32.1 5.32.0 5.31.3 5.31.2 5.31.1 5.31.0 5.30.1 5.30.0 5.29.0 5.28.4 5.28.3 5.28.2 5.28.1 5.28.0 5.27.0 5.26.5 5.26.4 5.26.3 5.26.2 5.26.1 5.26.0 5.25.0 5.24.2 5.24.1 5.23.0 5.22.2 5.22.1 5.22.0 5.21.0 5.20.1 5.20.0 5.19.4 5.19.3 5.19.2 5.19.1 5.19.0 5.18.0 5.17.0 5.16.3 5.16.1 5.16.0 5.15.1 5.15.0 5.14.0 5.13.1 5.13.0 5.12.1 5.12.0 5.11.2 5.11.1 5.10.1 5.10.0 5.9.0 5.8.0 5.7.0 5.6.1 5.6.0 5.5.0 5.4.2 5.4.1 5.4.0 5.3.0 5.2.2 5.2.1 5.2.0 5.1.2 5.1.1 4.79.0 4.78.0 4.77.0 4.76.2 4.75.3 4.75.2 4.75.1 4.74.0 4.73.1 4.73.0 4.72.3 4.72.2 4.72.1 4.72.0 4.71.1 4.71.0 4.70.0 4.69.4 4.69.3 4.69.2 4.69.1 4.69.0 4.68.0 4.67.5 4.67.4 4.67.3 4.67.2 4.67.0 4.66.0 4.65.2 4.65.1 4.64.0 4.63.2 4.63.1 4.63.0 4.62.0 4.61.1 4.61.0 4.60.4 4.60.3 4.60.2 4.60.1 4.60.0 4.59.0 4.58.0 4.57.2 4.57.1 4.57.0 4.56.2 4.56.1 4.56.0 4.55.0 4.54.0 4.53.0 4.52.1 4.52.0 4.51.3 4.51.2 4.51.0 4.50.0 4.49.3 4.49.2

OTP backports

Current section

Files

Jump to
otpbp src otpbp_proc_lib.erl
Raw

src/otpbp_proc_lib.erl

-module(otpbp_proc_lib).
-ifndef(HAVE_proc_lib__start_monitor_3).
% OTP 23.0
-export([start_monitor/3]).
-endif.
-ifndef(HAVE_proc_lib__start_monitor_4).
% OTP 23.0
-export([start_monitor/4]).
-endif.
-ifndef(HAVE_proc_lib__start_monitor_5).
% OTP 23.0
-export([start_monitor/5]).
-endif.
-ifndef(HAVE_proc_lib__init_fail_2).
% OTP 26.0
-export([init_fail/2]).
-endif.
-ifndef(HAVE_proc_lib__init_fail_3).
% OTP 26.0
-export([init_fail/3]).
-endif.
-ifndef(HAVE_proc_lib__get_label_1).
% OTP 27.0
-export([get_label/1]).
-endif.
-ifndef(HAVE_proc_lib__set_label_1).
% OTP 27.0
-export([set_label/1]).
-endif.
-ifndef(HAVE_proc_lib__init_fail_2).
-ifdef(HAVE_proc_lib__init_fail_3).
-import(proc_lib, [init_fail/3]).
-endif.
-endif.
-ifndef(HAVE_proc_lib__start_monitor_3).
start_monitor(M, F, A) when is_atom(M), is_atom(F), is_list(A) -> start_monitor(M, F, A, infinity).
-endif.
-ifndef(HAVE_proc_lib__start_monitor_4).
start_monitor(M, F, A, Timeout) when is_atom(M), is_atom(F), is_list(A) ->
sync_start_monitor(spawn_mon(M, F, A), Timeout).
-compile({inline, spawn_mon/3}).
spawn_mon(M, F, A) -> spawn_monitor(proc_lib, init_p, [get_my_name(), get_ancestors(), M, F, A]).
-compile({inline, get_my_name/0}).
get_my_name() ->
case proc_info(self(), registered_name) of
{registered_name, Name} -> Name;
_ -> self()
end.
-compile({inline, get_ancestors/0}).
get_ancestors() ->
case get('$ancestors') of
A when is_list(A) -> A;
_ -> []
end.
-ifndef(NEED_sync_start_monitor_2).
-define(NEED_sync_start_monitor_2, true).
-endif.
-ifndef(NEED_proc_info_2).
-define(NEED_proc_info_2, true).
-endif.
-endif.
-ifndef(HAVE_proc_lib__start_monitor_5).
start_monitor(M, F, A, Timeout, SpawnOpts) when is_atom(M), is_atom(F), is_list(A) ->
lists:member(monitor, SpawnOpts) andalso error(badarg, [M, F, A, Timeout, SpawnOpts]),
sync_start_monitor(proc_lib:spawn_opt(M, F, A, [monitor|SpawnOpts]), Timeout).
-ifndef(NEED_sync_start_monitor_2).
-define(NEED_sync_start_monitor_2, true).
-endif.
-endif.
-ifdef(NEED_sync_start_monitor_2).
sync_start_monitor({Pid, Ref}, Timeout) ->
receive
{ack, Pid, Return} -> {Return, Ref};
{'DOWN', Ref, process, Pid, Reason} = Down ->
self() ! Down,
{{error, Reason}, Ref}
after Timeout ->
kill_flush(Pid),
{{error, timeout}, Ref}
end.
-compile({inline, [kill_flush/1]}).
kill_flush(Pid) ->
unlink(Pid),
exit(Pid, kill),
receive
{'EXIT', Pid, _} -> ok
after 0 -> ok
end.
-endif.
-ifndef(HAVE_proc_lib__init_fail_2).
init_fail(Return, Exception) ->
[Parent|_] = get('$ancestors'),
init_fail(Parent, Return, Exception).
-endif.
-ifndef(HAVE_proc_lib__init_fail_3).
init_fail(Parent, Return, Exception) ->
Parent ! {nack, self(), Return},
case Exception of
{Class, Reason} when Class =:= error; Class =:= exit; Class =:= throw -> erlang:Class(Reason);
{Class, Reason, Stacktrace} -> error(erlang:raise(Class, Reason, Stacktrace), [Parent, Return, Exception])
end.
-endif.
-ifndef(HAVE_proc_lib__get_label_1).
get_label(Pid) when Pid =:= self() -> get('$process_label');
get_label(Pid) ->
try get_process_info(Pid, {dictionary, '$process_label'}) of
{process_label, Id} -> Id;
_ -> undefined
catch
_:_ -> %% Old Node
undefined
end.
get_process_info(Pid, Tag) -> translate_process_info(Tag, catch proc_info(Pid, Tag)).
-compile({inline, translate_process_info/2}).
translate_process_info(registered_name, []) -> {registered_name, []};
translate_process_info(_ , {'EXIT', _}) -> undefined;
translate_process_info(_, Result) -> Result.
-ifndef(NEED_proc_info_2).
-define(NEED_proc_info_2, true).
-endif.
-endif.
-ifndef(HAVE_proc_lib__set_label_1).
set_label(Label) ->
put('$process_label', Label),
ok.
-endif.
-ifdef(NEED_proc_info_2).
proc_info(Pid, Item) when node(Pid) =:= node() -> process_info(Pid,Item);
proc_info(Pid, Item) ->
case lists:member(node(Pid), nodes()) of
true ->
case rpc:call(node(Pid), erlang, process_info, [Pid, Item]) of
{badrpc, nodedown} -> undefined;
{badrpc, Error} -> Error;
Res -> Res
end;
_ -> hidden
end.
-endif.