From: Evgeny Khramtsov Date: Wed, 10 Jul 2019 07:28:37 +0000 (+0300) Subject: Fall back to map/2 and foreach/2 on single-core machines X-Git-Tag: 19.08~104 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=04ccba03476557751da02a0b2f66672517fc3a55;p=ejabberd Fall back to map/2 and foreach/2 on single-core machines --- 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).