|
50 | 50 | build_acyclic_graph/3]).
|
51 | 51 | -export([const/1]).
|
52 | 52 | -export([ntoa/1, ntoab/1]).
|
53 |
| --export([is_process_alive/1]). |
| 53 | +-export([is_process_alive/1, |
| 54 | + process_info/2]). |
54 | 55 | -export([pget/2, pget/3, pupdate/3, pget_or_die/2, pmerge/3, pset/3, plmerge/2]).
|
55 | 56 | -export([deep_pget/2, deep_pget/3]).
|
56 | 57 | -export([format_message_queue/2]).
|
@@ -812,6 +813,23 @@ is_process_alive(Pid) ->
|
812 | 813 | lists:member(Node, [node() | nodes(connected)]) andalso
|
813 | 814 | rpc:call(Node, erlang, is_process_alive, [Pid]) =:= true.
|
814 | 815 |
|
| 816 | +%% Get process info of a prossibly remote process. |
| 817 | +%% We try to avoid reconnecting to down nodes. |
| 818 | +-spec process_info(pid(), ItemSpec) -> Result| undefined | {badrpc, term()} |
| 819 | + when |
| 820 | + ItemSpec :: atom() | list() | tuple(), |
| 821 | + Result :: {atom() | tuple(), term()} | [{atom() | tuple(), term()}]. |
| 822 | +process_info(Pid, Items) when node(Pid) =:= node() -> |
| 823 | + erlang:process_info(Pid, Items); |
| 824 | +process_info(Pid, Items) -> |
| 825 | + Node = node(Pid), |
| 826 | + case lists:member(Node, [node() | nodes(connected)]) of |
| 827 | + true -> |
| 828 | + rpc:call(Node, erlang, process_info, [Pid, Items]); |
| 829 | + _ -> |
| 830 | + {badrcp, nodedown} |
| 831 | + end. |
| 832 | + |
815 | 833 | -spec pget(term(), list() | map()) -> term().
|
816 | 834 | pget(K, M) when is_map(M) ->
|
817 | 835 | maps:get(K, M, undefined);
|
|
0 commit comments