diff options
author | Björn Gustavsson <[email protected]> | 2017-06-01 15:16:00 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2017-06-03 08:45:47 +0200 |
commit | 7aa347e1f911f1bcef026c08e32cc4eed280ce38 (patch) | |
tree | d21b1b43fe611341bd95d9f088e0f9d5b825f441 /erts | |
parent | 6a18795542432fb3f8ba1d4306ec28d6a9250f3e (diff) | |
download | otp-7aa347e1f911f1bcef026c08e32cc4eed280ce38.tar.gz otp-7aa347e1f911f1bcef026c08e32cc4eed280ce38.tar.bz2 otp-7aa347e1f911f1bcef026c08e32cc4eed280ce38.zip |
same_time_yielding/1: Avoid failing if there are many schedulers
On a computer with 32 schedulers, there would be 9632 (301*32)
'timeout' message in the receive queue. Receiving them with a
selective receive (matching on the timer ID) is quite slow.
Change the test case to read out the queue in the order the
messages are stored in the queue.
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/test/timer_bif_SUITE.erl | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/erts/emulator/test/timer_bif_SUITE.erl b/erts/emulator/test/timer_bif_SUITE.erl index 7cbd93a0f3..a977eb41c4 100644 --- a/erts/emulator/test/timer_bif_SUITE.erl +++ b/erts/emulator/test/timer_bif_SUITE.erl @@ -488,24 +488,40 @@ registered_process(Config) when is_list(Config) -> same_time_yielding(Config) when is_list(Config) -> Mem = mem(), + Ref = make_ref(), SchdlrsOnln = erlang:system_info(schedulers_online), Tmo = erlang:monotonic_time(millisecond) + 3000, Tmrs = lists:map(fun (I) -> process_flag(scheduler, (I rem SchdlrsOnln) + 1), - erlang:start_timer(Tmo, self(), hej, [{abs, true}]) + erlang:start_timer(Tmo, self(), Ref, [{abs, true}]) end, lists:seq(1, (?TIMEOUT_YIELD_LIMIT*3+1)*SchdlrsOnln)), true = mem_larger_than(Mem), - lists:foreach(fun (Tmr) -> receive {timeout, Tmr, hej} -> ok end end, Tmrs), + receive_all_timeouts(length(Tmrs), Ref), Done = erlang:monotonic_time(millisecond), true = Done >= Tmo, + MsAfterTmo = Done - Tmo, + io:format("Done ~p ms after Tmo\n", [MsAfterTmo]), case erlang:system_info(build_type) of - opt -> true = Done < Tmo + 200; - _ -> true = Done < Tmo + 1000 + opt -> + true = MsAfterTmo < 200; + _ -> + true = MsAfterTmo < 1000 end, Mem = mem(), ok. +%% Read out all timeouts in receive queue order. This is efficient +%% even if there are very many messages. + +receive_all_timeouts(0, _Ref) -> + ok; +receive_all_timeouts(N, Ref) -> + receive + {timeout, _Tmr, Ref} -> + receive_all_timeouts(N-1, Ref) + end. + same_time_yielding_with_cancel(Config) when is_list(Config) -> same_time_yielding_with_cancel_test(false, false). |