aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib/test/supervisor_deadlock.erl
diff options
context:
space:
mode:
authorSiri Hansen <[email protected]>2012-03-05 11:43:08 +0100
committerSiri Hansen <[email protected]>2012-03-05 11:43:08 +0100
commit096ed7e301ce16dfb69709d7001ea3d5f370c202 (patch)
treed2a6f3dd000d2a1ce843d5c687498b9d43cc4879 /lib/stdlib/test/supervisor_deadlock.erl
parentd1e67d51a6d754e5a055c81c9d7447e0d87e982f (diff)
parente6e31791abf090fe7e0bd3e5970b44830d087c4a (diff)
downloadotp-096ed7e301ce16dfb69709d7001ea3d5f370c202.tar.gz
otp-096ed7e301ce16dfb69709d7001ea3d5f370c202.tar.bz2
otp-096ed7e301ce16dfb69709d7001ea3d5f370c202.zip
Merge branch 'siri/stdlib/hanging-restart-loop/OTP-9549' into maint
* siri/stdlib/hanging-restart-loop/OTP-9549: Leave control back to gen_server during supervisor's restart loop
Diffstat (limited to 'lib/stdlib/test/supervisor_deadlock.erl')
-rw-r--r--lib/stdlib/test/supervisor_deadlock.erl45
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/stdlib/test/supervisor_deadlock.erl b/lib/stdlib/test/supervisor_deadlock.erl
new file mode 100644
index 0000000000..288547a972
--- /dev/null
+++ b/lib/stdlib/test/supervisor_deadlock.erl
@@ -0,0 +1,45 @@
+-module(supervisor_deadlock).
+-compile(export_all).
+
+
+%%%-----------------------------------------------------------------
+%%% gen_server callbacks
+init([child]) ->
+ case ets:lookup(supervisor_deadlock,fail_start) of
+ [{fail_start, false}] ->
+ %% we must not fail on the first init, otherwise supervisor
+ %% terminates immediately
+ {ok, []};
+ [{fail_start, true}] ->
+ %% Restart frequency is MaxR=8, MaxT=10, so this will
+ %% ensure that restart intensity is not reached -> restart
+ %% loop
+ timer:sleep(2000), % NOTE: this could be a gen_server call timeout
+
+ {stop, error}
+ end.
+
+handle_call(_Req, _From, State) ->
+ {reply, ok, State}.
+
+%% Force a restart
+handle_cast(restart, State) ->
+ {stop, error, State}.
+
+handle_info(_Msg, State) ->
+ {noreply, State}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+
+%%%-----------------------------------------------------------------
+%%% Start child
+start_child() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [child], []).
+
+restart_child() ->
+ gen_server:cast(supervisor_deadlock, restart).