diff options
Diffstat (limited to 'lib/snmp/src/manager/snmpm_misc_sup.erl')
-rw-r--r-- | lib/snmp/src/manager/snmpm_misc_sup.erl | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/lib/snmp/src/manager/snmpm_misc_sup.erl b/lib/snmp/src/manager/snmpm_misc_sup.erl new file mode 100644 index 0000000000..1a5d7676df --- /dev/null +++ b/lib/snmp/src/manager/snmpm_misc_sup.erl @@ -0,0 +1,112 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-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% +%% + +-module(snmpm_misc_sup). + +-include("snmp_debug.hrl"). + +-behaviour(supervisor). + +%% External exports +-export([ + start_link/0, + start_net_if/2, stop_net_if/0, + start_note_store/2, stop_note_store/0 + ]). + +%% Internal exports +-export([init/1]). + +-define(SUP, ?MODULE). + + +%%%----------------------------------------------------------------- +%%% This is a supervisor for the mib and net_ifprocesses. +%%% Each agent has one mib process. +%%%----------------------------------------------------------------- + +start_link() -> + ?d("start_link -> entry", []), + SupName = {local,?SUP}, + supervisor:start_link(SupName, ?MODULE, []). + + +start_net_if(Mod, NoteStore) -> + ?d("start_net_if -> entry with" + "~n Mod: ~p" + "~n NoteStore: ~p", [Mod, NoteStore]), + SupName = ?SUP, + Name = net_if, + Args = [self(), NoteStore], + start_sup_child(SupName, Name, Mod, Args). + +stop_net_if() -> + stop_sup_child(?SUP, net_if). + + +%% The note store is a common code component, so we must +%% pass all the arguments in a way that works both for +%% the agent and the manager entities. I.e. as arguments +%% to the start_link function. +start_note_store(Prio, Opts) -> + ?d("start_note_store -> entry with" + "~n Prio: ~p" + "~n Opts: ~p", [Prio, Opts]), + SupName = ?MODULE, + Name = note_store, + Mod = snmp_note_store, + Args = [Prio, snmpm, Opts], + start_sup_child(SupName, Name, Mod, Args). + +stop_note_store() -> + stop_sup_child(?SUP, note_store). + + +%% --------------------------------------------------------------- + +start_sup_child(SupName, Name, Mod, Args) -> + %% make sure we start from scratch... + Children = supervisor:which_children(SupName), + case lists:keysearch(Name, 1, Children) of + {value, {_, _Pid, _, _}} -> + stop_sup_child(SupName, Name); + _ -> + ok + end, + Spec = {Name, + {Mod, start_link, Args}, + temporary, 2000, worker, [Mod]}, + supervisor:start_child(SupName, Spec). + +stop_sup_child(SupName, Name) -> + case whereis(SupName) of + undefined -> + ok; + _ -> + supervisor:terminate_child(SupName, Name), + supervisor:delete_child(SupName, Name) + end. + + + +init([]) -> + ?d("init -> entry", []), + SupFlags = {one_for_all, 0, 3600}, + {ok, {SupFlags, []}}. + |