From 04ccba03476557751da02a0b2f66672517fc3a55 Mon Sep 17 00:00:00 2001 From: Evgeny Khramtsov Date: Wed, 10 Jul 2019 10:28:37 +0300 Subject: [PATCH] Fall back to map/2 and foreach/2 on single-core machines --- src/misc.erl | 64 +++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/src/misc.erl b/src/misc.erl index 3aacd3a6c..158c11455 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -446,41 +446,49 @@ best_match(Pattern, Opts) -> -spec pmap(fun((T1) -> T2), [T1]) -> [T2]. pmap(Fun, [_,_|_] = List) -> - Self = self(), - lists:map( - fun({Pid, Ref}) -> - receive - {Pid, Ret} -> + case erlang:system_info(logical_processors) of + 1 -> lists:map(Fun, List); + _ -> + Self = self(), + lists:map( + fun({Pid, Ref}) -> receive - {'DOWN', Ref, _, _, _} -> - Ret - end; - {'DOWN', Ref, _, _, Reason} -> - exit(Reason) - end - end, [spawn_monitor( - fun() -> Self ! {self(), Fun(X)} end) - || X <- List]); + {Pid, Ret} -> + receive + {'DOWN', Ref, _, _, _} -> + Ret + end; + {'DOWN', Ref, _, _, Reason} -> + exit(Reason) + end + end, [spawn_monitor( + fun() -> Self ! {self(), Fun(X)} end) + || X <- List]) + end; pmap(Fun, List) -> lists:map(Fun, List). -spec peach(fun((T) -> any()), [T]) -> ok. peach(Fun, [_,_|_] = List) -> - Self = self(), - lists:foreach( - fun({Pid, Ref}) -> - receive - Pid -> + case erlang:system_info(logical_processors) of + 1 -> lists:foreach(Fun, List); + _ -> + Self = self(), + lists:foreach( + fun({Pid, Ref}) -> receive - {'DOWN', Ref, _, _, _} -> - ok - end; - {'DOWN', Ref, _, _, Reason} -> - exit(Reason) - end - end, [spawn_monitor( - fun() -> Fun(X), Self ! self() end) - || X <- List]); + Pid -> + receive + {'DOWN', Ref, _, _, _} -> + ok + end; + {'DOWN', Ref, _, _, Reason} -> + exit(Reason) + end + end, [spawn_monitor( + fun() -> Fun(X), Self ! self() end) + || X <- List]) + end; peach(Fun, List) -> lists:foreach(Fun, List).