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 | |
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.
-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). |