aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2016-11-17 17:35:17 +0100
committerSverker Eriksson <[email protected]>2016-11-30 14:17:09 +0100
commit20eea6a99b25b99db728fcae5b8303739e5c1cc8 (patch)
tree21236e0756ecca2649a869531d2a476491a5e0ee
parent15789e168811d6e6bed082ea7c64db93e1d968e8 (diff)
downloadotp-20eea6a99b25b99db728fcae5b8303739e5c1cc8.tar.gz
otp-20eea6a99b25b99db728fcae5b8303739e5c1cc8.tar.bz2
otp-20eea6a99b25b99db728fcae5b8303739e5c1cc8.zip
erts: Fix race in code_SUITE:call_purged_fun_*
Must wait for process P0 to enter fun F2 before starting purge, to make sure it's not suspended.
-rw-r--r--erts/emulator/test/code_SUITE_data/call_purged_fun_tester.erl29
1 files changed, 19 insertions, 10 deletions
diff --git a/erts/emulator/test/code_SUITE_data/call_purged_fun_tester.erl b/erts/emulator/test/code_SUITE_data/call_purged_fun_tester.erl
index 10d00b7d2a..699f0c1161 100644
--- a/erts/emulator/test/code_SUITE_data/call_purged_fun_tester.erl
+++ b/erts/emulator/test/code_SUITE_data/call_purged_fun_tester.erl
@@ -39,14 +39,16 @@ do_it(Priv, Data, Type, Opts) ->
ets:insert(T, {my_fun,my_code_test2:make_fun(4711)}),
ets:insert(T, {my_fun2,my_code_test2:make_fun2()}),
- spawn(fun () ->
- [{my_fun2,F2}] = ets:lookup(T, my_fun2),
- F2(fun () ->
- receive after infinity -> ok end
- end,
- fun () -> ok end),
- exit(completed)
- end),
+ Papa = self(),
+ {P0,M0} = spawn_monitor(fun () ->
+ [{my_fun2,F2}] = ets:lookup(T, my_fun2),
+ F2(fun () ->
+ Papa ! {self(),"going to sleep"},
+ receive {Papa,"wake up"} -> ok end
+ end,
+ fun () -> ok end),
+ exit(completed)
+ end),
?line PurgeType = case Type of
code_gone ->
@@ -60,6 +62,10 @@ do_it(Priv, Data, Type, Opts) ->
?line true = erlang:delete_module(my_code_test2),
+ ?line ok = receive {P0, "going to sleep"} -> ok
+ after 1000 -> timeout
+ end,
+
?line Purge = start_purge(my_code_test2, PurgeType),
?line {P1, M1} = spawn_monitor(fun () ->
@@ -110,9 +116,12 @@ do_it(Priv, Data, Type, Opts) ->
case Type of
code_there ->
- ?line false = complete_purge(Purge);
+ ?line false = complete_purge(Purge),
+ P0 ! {self(), "wake up"},
+ ?line completed = wait_for_down(P0,M0);
_ ->
- ?line {true, true} = complete_purge(Purge)
+ ?line {true, true} = complete_purge(Purge),
+ ?line killed = wait_for_down(P0,M0)
end,
case Type of