From f115892d729fd919b77f85855735398e90f801f0 Mon Sep 17 00:00:00 2001 From: Micael Karlberg Date: Wed, 31 Jul 2019 19:08:50 +0200 Subject: [snmp] Fixed agent|manager top supervisor stop --- lib/snmp/src/agent/snmpa_supervisor.erl | 35 ++++++++++++++++++++++++++++++- lib/snmp/src/manager/snmpm_supervisor.erl | 7 ++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/lib/snmp/src/agent/snmpa_supervisor.erl b/lib/snmp/src/agent/snmpa_supervisor.erl index 2cb0556001..7d5c6da2c8 100644 --- a/lib/snmp/src/agent/snmpa_supervisor.erl +++ b/lib/snmp/src/agent/snmpa_supervisor.erl @@ -22,7 +22,7 @@ -behaviour(supervisor). %% External exports --export([start_link/2]). +-export([start_link/2, stop/0, stop/1]). -export([start_sub_sup/1, start_master_sup/1]). -export([start_sub_agent/3, stop_sub_agent/1]). @@ -91,6 +91,39 @@ start_link(master, Opts, {takeover, Node}) -> Else end. + +stop() -> + stop(0). + +stop(Timeout) -> + case whereis(?SERVER) of + Pid when is_pid(Pid) -> + stop(Pid, Timeout); + _ -> + not_running + end. + +%% For some unfathomable reason there is no "nice" way to stop +%% a supervisor. The "normal" way to do it is: +%% 1) exit(Pid, kill) (kaboom) +%% 2) If the caller is the *parent*: exit(Pid, shutdown) +%% So, here we do it the really ugly way...but since this function is +%% intended for testing (mostly)... +stop(Pid, Timeout) when (Timeout =:= 0) -> + sys:terminate(Pid, shutdown), + ok; +stop(Pid, Timeout) -> + MRef = erlang:monitor(process, Pid), + sys:terminate(Pid, shutdown), + receive + {'DOWN', MRef, process, Pid, _} -> + ok + after Timeout -> + erlang:demonitor(MRef, [flush]), + {error, timeout} + end. + + get_own_loaded_mibs() -> AgentInfo = snmpa:info(snmp_master_agent), [ Name || {Name, _, _} <- loaded_mibs(AgentInfo) ]. diff --git a/lib/snmp/src/manager/snmpm_supervisor.erl b/lib/snmp/src/manager/snmpm_supervisor.erl index 0061488f54..bc66025c6f 100644 --- a/lib/snmp/src/manager/snmpm_supervisor.erl +++ b/lib/snmp/src/manager/snmpm_supervisor.erl @@ -38,6 +38,7 @@ %%%------------------------------------------------------------------- %%% API %%%------------------------------------------------------------------- + start_link(Type, Opts) -> ?d("start_link -> entry with" "~n Opts: ~p", [Opts]), @@ -62,17 +63,17 @@ stop(Timeout) -> %% a supervisor. The "normal" way to do it is: %% 1) exit(Pid, kill) (kaboom) %% 2) If the caller is the *parent*: exit(Pid, shutdown) -%% So, here we do it the really unly way...but since this function is +%% So, here we do it the really ugly way...but since this function is %% intended for testing (mostly)... stop(Pid, Timeout) when (Timeout =:= 0) -> ?d("stop -> Pid: ~p", [Pid]), - sys:terminate(whereis(?SERVER), shutdown), + sys:terminate(Pid, shutdown), ?d("stop -> stopped", []), ok; stop(Pid, Timeout) -> ?d("stop -> Pid: ~p", [Pid]), MRef = erlang:monitor(process, Pid), - sys:terminate(whereis(?SERVER), shutdown), + sys:terminate(Pid, shutdown), receive {'DOWN', MRef, process, Pid, _} -> ?d("stop -> stopped", []), -- cgit v1.2.3