📄 pman_relay.erl
字号:
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%%%----------------------------------------------------------------------%% Purpose : Interface function to relay calls (esp. trace calls) %% to processes on other nodes. Some of the calls%% are conditionally relayed.%%-----------------------------------------------------------------------module(pman_relay).%%-compile(export_all).-export([start/1, ok_to_trace/1, trac/3]).-include("assert.hrl").%% --------------------------------------------------------------%% DISTRIBUTION%% --------------------------------------------------------------%% (???) Process dictionary alert!!!%%%% Since we are not allowed to do erlang:trace/3 on remote%% processe we create a help process at the remote node to%% do the job for us %% ---------------------------------------------------------------start(P) when is_pid(P), node(P)/=node() -> %% Remote supervision, relaying necessary put(relay, spawn_link(node(P), pman_relay_server, init, [self()]));start(_) -> %% Local supervision, no relaying ignore.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ok_to_trace/1 - Tests wheter we can actually start tracing %% a process.%%%% Arguments:%% Pid Pid of the process to trace (on local or remote node)%%%% Returns%% true If it is OK to trace the process%% false If the process is already traced, or some other%% condition prevents it from being traced.ok_to_trace(Pid) when node(Pid) == node()-> %% Local trace, no relaying case catch erlang:trace(Pid, false, [send]) of 1 -> true; _Otherwise -> false end;ok_to_trace(Pid) -> %% Remote trace, relaying necessary PidRelay = get(relay), PidRelay ! {ok_to_trace, self(), Pid}, receive {ok_to_trace, PidRelay} -> true; {not_ok_to_trace, PidRelay} -> false; _Otherwise -> ?ALWAYS_ASSERT("Unexpected message from relay process") after 5000 -> false end. %% ---------------------------------------------------------------%% Possibly send a request to do tracing to a remote node.%% ---------------------------------------------------------------trac(Pid, How, Flag) when node(Pid) == node() -> %% Local trace, no relaying necessary case catch erlang:trace(Pid, How, Flag) of 1 -> ok; _ -> pman_win:format("** Illegal trace request ** \n", []) end; trac(Pid, How, Flag) -> %% Remote trace, relaying necessary get(relay) ! {self(), erlang, trace, [Pid, How, Flag]}.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -