aboutsummaryrefslogtreecommitdiffstats
path: root/lib/runtime_tools/src/inviso_as_lib.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/runtime_tools/src/inviso_as_lib.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/runtime_tools/src/inviso_as_lib.erl')
-rw-r--r--lib/runtime_tools/src/inviso_as_lib.erl155
1 files changed, 155 insertions, 0 deletions
diff --git a/lib/runtime_tools/src/inviso_as_lib.erl b/lib/runtime_tools/src/inviso_as_lib.erl
new file mode 100644
index 0000000000..75f3d9d004
--- /dev/null
+++ b/lib/runtime_tools/src/inviso_as_lib.erl
@@ -0,0 +1,155 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%%
+%% 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 online 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.
+%%
+%% %CopyrightEnd%
+%%
+
+%%% File : inviso_as_lib.erl
+%%% Author : Lennart �hman <[email protected]>
+%%% Description :
+%% The purpose of the inviso autostart library is to provide useful functions
+%% for anyone wanting to customize the autostart mechanism in the inviso
+%% tracer. It is intended to work well with the example 'inviso_autostart_server'.
+%%%
+%%% Created : 15 Dec 2005 by Lennart �hman
+%% -----------------------------------------------------------------------------
+
+-module(inviso_as_lib).
+
+-export([setup_autostart/7,setup_autostart/8,setup_autostart/9,
+ inhibit_autostart/1,
+ set_repeat/2,set_repeat_2/2]).
+%% -----------------------------------------------------------------------------
+
+%% setup_autostart(Node,Repeat,Options,TracerData,CmdFiles,Bindings) = ok|{error,Reason}.
+%% Repeat=integer(), where 0 means no (more) autostarts.
+%% Options=List of options as taken by the runtime component at start-up.
+%% TracerData= Tracerdata as given to inviso_rt:init_tracing.
+%% CmdFiles=[FileName,...] list of string(), files that will be executed
+%% by the subprocess started during autostart.
+%% Bindings=[{VarName,Value},...] Variable bindings for CmdFiles.
+%% VarName=atom(),
+%%
+%% This function creates the inviso_autostart.config file on Erlang node Node.
+%% This is useful when you wish to prepare for an autostarted trace.
+setup_autostart(Node,Repeat,Options,TracerData,CmdFiles,Bindings,Translations) ->
+ setup_autostart(Node,Repeat,Options,TracerData,CmdFiles,
+ Bindings,Translations,inviso_std_ref,off).
+setup_autostart(Node,Repeat,Options,TracerData,CmdFiles,Bindings,Translations,RTtag) ->
+ setup_autostart(Node,Repeat,Options,TracerData,CmdFiles,
+ Bindings,Translations,RTtag,off).
+setup_autostart(Node,Repeat,Options,TracerData,CmdFiles,Bindings,Translations,RTtag,Dbg) ->
+ case rpc:call(Node,inviso_autostart,which_config_file,[]) of
+ FileName when is_list(FileName) -> % Write to this file then.
+ {String,Args}=format_config_file(Repeat,TracerData,Options,CmdFiles,
+ Bindings,Translations,RTtag,Dbg),
+ Bytes=list_to_binary(io_lib:format(String,Args)),
+ case rpc:call(Node,file,write_file,[FileName,Bytes]) of
+ ok ->
+ ok;
+ {error,Reason} ->
+ {error,{write_file,Reason}};
+ {badrpc,Reason} ->
+ {error,{badrpc,{write_file,Reason}}}
+ end;
+ {error,Reason} ->
+ {error,{which_config_file,Reason}};
+ {badrpc,Reason} ->
+ {error,{badrpc,{which_config_file,Reason}}}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% inhibit_autostart(Node) = ok|{error,Reason}
+%%
+%% Inhibits autostart by simply making the repeat parameter zero in the
+%% configuration file at node Node. All other parameters are left untouched.
+inhibit_autostart(Node) ->
+ set_repeat(Node,0).
+%% -----------------------------------------------------------------------------
+
+%% set_repeat(Node,N)=ok | {error,Reason}
+%% N=integer(), the number of time autostart shall be allowed.
+set_repeat(Node,N) ->
+ case examine_config_file(Node) of
+ {ok,FileName,Terms} ->
+ NewTerms=[{repeat,N}|lists:keydelete(repeat,1,Terms)],
+ case rpc:call(Node,?MODULE,set_repeat_2,[FileName,NewTerms]) of
+ {badrpc,Reason} ->
+ {error,{badrpc,{open,Reason}}};
+ Result ->
+ Result
+ end;
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+%% Must be a sepparate function to do rpc on. The entire function must be done
+%% in one rpc call. Otherwise the FD will die since it is linked to the opening
+%% process.
+set_repeat_2(FileName,NewTerms) ->
+ case file:open(FileName,[write]) of
+ {ok,FD} ->
+ String=lists:flatten(lists:map(fun(_)->"~w.~n" end,NewTerms)),
+ case catch io:format(FD,String,NewTerms) of
+ ok ->
+ file:close(FD),
+ ok;
+ {'EXIT',Reason} ->
+ file:close(FD),
+ {error,{format,Reason}}
+ end;
+ {error,Reason} ->
+ {error,Reason}
+ end.
+%% -----------------------------------------------------------------------------
+
+examine_config_file(Node) ->
+ case rpc:call(Node,inviso_autostart,which_config_file,[]) of
+ FileName when is_list(FileName) -> % Read this file, and then modify it.
+ case rpc:call(Node,file,consult,[FileName]) of
+ {ok,Terms} ->
+ {ok,FileName,Terms};
+ {error,Reason} ->
+ {error,{consult,Reason}};
+ {badrpc,Reason} ->
+ {error,{badrpc,{consult,Reason}}}
+ end;
+ {error,Reason} ->
+ {error,{which_config_file,Reason}};
+ {badrpc,Reason} ->
+ {error,{badrpc,{which_config_file,Reason}}}
+ end.
+%% -----------------------------------------------------------------------------
+
+format_config_file(Repeat,TracerData,Options,CmdFiles,Bindings,Translations,RTtag,Dbg) ->
+ String="~w.~n~w.~n~w.~n~w.~n",
+ Args=[{repeat,Repeat},
+ {mfa,{inviso_autostart_server,init,[[{tracerdata,TracerData},
+ {cmdfiles,CmdFiles},
+ {bindings,Bindings},
+ {translations,Translations},
+ {debug,Dbg}]]}},
+ {options,Options},
+ {tag,RTtag}],
+ {String,Args}.
+%% -----------------------------------------------------------------------------
+
+
+
+
+
+
+