File 0730-snmp-Fixed-agent-manager-top-supervisor-stop.patch of Package erlang
From f115892d729fd919b77f85855735398e90f801f0 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Wed, 31 Jul 2019 19:08:50 +0200
Subject: [PATCH] [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", []),
--
2.16.4