summaryrefslogtreecommitdiff
path: root/erts/emulator/test/process_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/test/process_SUITE.erl')
-rw-r--r--erts/emulator/test/process_SUITE.erl50
1 files changed, 49 insertions, 1 deletions
diff --git a/erts/emulator/test/process_SUITE.erl b/erts/emulator/test/process_SUITE.erl
index f6c6526f54..d28c4d15db 100644
--- a/erts/emulator/test/process_SUITE.erl
+++ b/erts/emulator/test/process_SUITE.erl
@@ -95,6 +95,8 @@
alias_bif/1,
monitor_alias/1,
spawn_monitor_alias/1,
+ demonitor_aliasmonitor/1,
+ down_aliasmonitor/1,
monitor_tag/1,
no_pid_wrap/1]).
@@ -184,7 +186,8 @@ groups() ->
gc_request_when_gc_disabled, gc_request_blast_when_gc_disabled,
otp_16436, otp_16642]},
{alias, [],
- [alias_bif, monitor_alias, spawn_monitor_alias]}].
+ [alias_bif, monitor_alias, spawn_monitor_alias,
+ demonitor_aliasmonitor, down_aliasmonitor]}].
init_per_suite(Config) ->
A0 = case application:start(sasl) of
@@ -5025,6 +5028,51 @@ spawn_monitor_alias_test(Peer, Node, SpawnType, ExitReason) ->
ok
end.
+demonitor_aliasmonitor(Config) when is_list(Config) ->
+ {ok, Peer, Node} = ?CT_PEER(),
+ Fun = fun () ->
+ receive
+ {alias, Alias} ->
+ Alias ! {alias_reply, Alias, self()}
+ end
+ end,
+ LPid = spawn(Fun),
+ RPid = spawn(Node, Fun),
+ AliasMonitor = erlang:monitor(process, LPid, [{alias, explicit_unalias}]),
+ erlang:demonitor(AliasMonitor),
+ LPid ! {alias, AliasMonitor},
+ receive {alias_reply, AliasMonitor, LPid} -> ok end,
+ %% Demonitor signal has been received and cleaned up. Cleanup of
+ %% it erroneously removed it from the alias table which caused
+ %% remote use of the alias to stop working...
+ RPid ! {alias, AliasMonitor},
+ receive {alias_reply, AliasMonitor, RPid} -> ok end,
+ exit(LPid, kill),
+ peer:stop(Peer),
+ false = is_process_alive(LPid),
+ ok.
+
+down_aliasmonitor(Config) when is_list(Config) ->
+ {ok, Peer, Node} = ?CT_PEER(),
+ LPid = spawn(fun () -> receive infinty -> ok end end),
+ RPid = spawn(Node,
+ fun () ->
+ receive
+ {alias, Alias} ->
+ Alias ! {alias_reply, Alias, self()}
+ end
+ end),
+ AliasMonitor = erlang:monitor(process, LPid, [{alias, explicit_unalias}]),
+ exit(LPid, bye),
+ receive {'DOWN', AliasMonitor, process, LPid, bye} -> ok end,
+ %% Down signal has been received and cleaned up. Cleanup of
+ %% it erroneously removed it from the alias table which caused
+ %% remote use of the alias to stop working...
+ RPid ! {alias, AliasMonitor},
+ receive {alias_reply, AliasMonitor, RPid} -> ok end,
+ peer:stop(Peer),
+ ok.
+
monitor_tag(Config) when is_list(Config) ->
%% Exit signals with immediate exit reasons are sent
%% in a different manner than compound exit reasons, and