diff options
Diffstat (limited to 'erts/emulator/test/timer_bif_SUITE.erl')
-rw-r--r-- | erts/emulator/test/timer_bif_SUITE.erl | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/erts/emulator/test/timer_bif_SUITE.erl b/erts/emulator/test/timer_bif_SUITE.erl index 98d43cb70d..28f4fdf943 100644 --- a/erts/emulator/test/timer_bif_SUITE.erl +++ b/erts/emulator/test/timer_bif_SUITE.erl @@ -23,7 +23,7 @@ -export([all/0, suite/0, init_per_suite/1, end_per_suite/1, init_per_testcase/2,end_per_testcase/2]). -export([start_timer_1/1, send_after_1/1, send_after_2/1, send_after_3/1, - cancel_timer_1/1, + cancel_timer_1/1, cancel_timer_sync/1, start_timer_big/1, send_after_big/1, start_timer_e/1, send_after_e/1, cancel_timer_e/1, read_timer_trivial/1, read_timer/1, read_timer_async/1, @@ -63,7 +63,7 @@ suite() -> all() -> [start_timer_1, send_after_1, send_after_2, - cancel_timer_1, start_timer_e, send_after_e, + cancel_timer_1, cancel_timer_sync, start_timer_e, send_after_e, cancel_timer_e, start_timer_big, send_after_big, read_timer_trivial, read_timer, read_timer_async, cleanup, evil_timers, registered_process, @@ -165,6 +165,60 @@ cancel_timer_1(Config) when is_list(Config) -> ok. +cancel_timer_sync(Config) when is_list(Config) -> + cancel_timer_sync_test(true), + cancel_timer_sync_test(false). + +cancel_timer_sync_test(SameSched) -> + process_flag(scheduler, 1), + + R1 = erlang:send_after(1000, self(), cling), + R2 = erlang:send_after(1000, self(), clong), + R3 = erlang:send_after(1000, self(), clang), + TsSet = erlang:monotonic_time(), + R4 = erlang:send_after(0, self(), pling), + R5 = erlang:send_after(0, self(), plong), + R6 = erlang:send_after(0, self(), plang), + R7 = make_ref(), + R8 = make_ref(), + R9 = make_ref(), + + case SameSched of + true -> + %% Cancel from the same scheduler... + ok; + false-> + %% Cancel from different scheduler... + process_flag(scheduler, erlang:system_info(schedulers_online)) + end, + + C1 = erlang:cancel_timer(R1), + true = is_integer(C1), + C2 = erlang:cancel_timer(R2, [{info, true}]), + true = is_integer(C2), + ok = erlang:cancel_timer(R3, [{info, false}]), + + receive pling -> ok end, + receive plong -> ok end, + receive plang -> ok end, + + false = erlang:cancel_timer(R4), + false = erlang:cancel_timer(R5, [{info, true}]), + ok = erlang:cancel_timer(R6, [{info, false}]), + + false = erlang:cancel_timer(R7), + false = erlang:cancel_timer(R8, [{info, true}]), + ok = erlang:cancel_timer(R9, [{info, false}]), + + Wait = 1500 - erlang:convert_time_unit(erlang:monotonic_time() - TsSet, + native, millisecond), + + receive TMO when TMO == cling; TMO == clang; TMO == clong -> + ct:fail({unexpected_timeout, TMO}) + after Wait -> + ok + end. + %% Error cases for start_timer/3 start_timer_e(Config) when is_list(Config) -> {'EXIT', _} = (catch erlang:start_timer(-4, self(), hej)), |