File 0728-snmp-manager-Stop-the-manager.patch of Package erlang

From 103c1ea8ee98f0c6c3e7817e88f427bcceda122d Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Tue, 23 Jul 2019 16:17:07 +0200
Subject: [PATCH 2/3] [snmp|manager] Stop the manager

Make stopping the manager (the entire manager sup tree)
more easy. The function(s) for starting and stopping the
manager that exist in the snmpm module is (mostly) intended
for testing, making the stop function more "potent" is no
real problem (now any process not just the parent) can stop
the manager process tree.
---
 lib/snmp/src/manager/snmpm.erl            | 11 ++++++---
 lib/snmp/src/manager/snmpm_supervisor.erl | 39 ++++++++++++++++++++++++++-----
 2 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/lib/snmp/src/manager/snmpm.erl b/lib/snmp/src/manager/snmpm.erl
index cf8c95d69f..8e60cecaf9 100644
--- a/lib/snmp/src/manager/snmpm.erl
+++ b/lib/snmp/src/manager/snmpm.erl
@@ -1,7 +1,7 @@
 %% 
 %% %CopyrightBegin%
 %% 
-%% Copyright Ericsson AB 2004-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2019. All Rights Reserved.
 %% 
 %% Licensed under the Apache License, Version 2.0 (the "License");
 %% you may not use this file except in compliance with the License.
@@ -32,7 +32,7 @@
 	 %% Management API
 	 start/0, start/1, 
 	 start_link/0, start_link/1, 
-	 stop/0, 
+	 stop/0, stop/1,
 
 	 monitor/0, demonitor/1, 
 	 notify_started/1, cancel_notify_started/1, 
@@ -196,7 +196,12 @@ start(Opts) ->
     ok.
 
 stop() ->
-    snmpm_supervisor:stop().
+    stop(0).
+
+stop(Timeout) when (Timeout =:= infinity) orelse
+                   (is_integer(Timeout) andalso (Timeout >= 0)) ->
+    snmpm_supervisor:stop(Timeout).
+
 
 
 monitor() ->
diff --git a/lib/snmp/src/manager/snmpm_supervisor.erl b/lib/snmp/src/manager/snmpm_supervisor.erl
index c36bbe1bdd..0061488f54 100644
--- a/lib/snmp/src/manager/snmpm_supervisor.erl
+++ b/lib/snmp/src/manager/snmpm_supervisor.erl
@@ -1,7 +1,7 @@
 %% 
 %% %CopyrightBegin%
 %% 
-%% Copyright Ericsson AB 2004-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2019. All Rights Reserved.
 %% 
 %% Licensed under the Apache License, Version 2.0 (the "License");
 %% you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
 
 
 %% External exports
--export([start_link/2, stop/0]).
+-export([start_link/2, stop/0, stop/1]).
 
 %% supervisor callbacks
 -export([init/1]).
@@ -44,20 +44,47 @@ start_link(Type, Opts) ->
     SupName = {local, ?MODULE}, 
     supervisor:start_link(SupName, ?MODULE, [Type, Opts]).
 
+
 stop() ->
+    stop(0).
+
+stop(Timeout) ->
     ?d("stop -> entry", []),
     case whereis(?SERVER) of
 	Pid when is_pid(Pid) ->
-	    ?d("stop -> Pid: ~p", [Pid]),
-	    exit(Pid, shutdown),
-	    ?d("stop -> stopped", []),
-	    ok;
+            stop(Pid, Timeout);
 	_ ->
 	    ?d("stop -> not running", []),
 	    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 unly 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),
+    ?d("stop -> stopped", []),
+    ok;
+stop(Pid, Timeout) ->
+    ?d("stop -> Pid: ~p", [Pid]),
+    MRef = erlang:monitor(process, Pid),
+    sys:terminate(whereis(?SERVER), shutdown),
+    receive
+        {'DOWN', MRef, process, Pid, _} ->
+            ?d("stop -> stopped", []),
+            ok
+    after Timeout ->
+            ?d("stop -> timeout", []),
+            erlang:demonitor(MRef, [flush]),
+            {error, timeout}
+    end.
+
 
+    
 %%%-------------------------------------------------------------------
 %%% Callback functions from supervisor
 %%%-------------------------------------------------------------------
-- 
2.16.4

openSUSE Build Service is sponsored by