Skip to content

Commit 744e8b6

Browse files
committed
Do not run async groups on load
1 parent 462f614 commit 744e8b6

File tree

1 file changed

+22
-36
lines changed

1 file changed

+22
-36
lines changed

lib/ex_unit/lib/ex_unit/server.ex

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -143,25 +143,16 @@ defmodule ExUnit.Server do
143143
state =
144144
update_in(
145145
state.async_modules,
146-
&Enum.reduce(names, &1, fn name, q -> :queue.in({:module, name}, q) end)
146+
&Enum.reduce(names, &1, fn name, q -> :queue.in(name, q) end)
147147
)
148148

149149
{:reply, :ok, take_modules(state)}
150150
end
151151

152152
def handle_call({:add, true = _async, group, names}, _from, %{loaded: loaded} = state)
153153
when is_integer(loaded) do
154-
{async_groups, async_modules} =
155-
case state.async_groups do
156-
%{^group => entries} = async_groups ->
157-
{%{async_groups | group => names ++ entries}, state.async_modules}
158-
159-
%{} = async_groups ->
160-
{Map.put(async_groups, group, names), :queue.in({:group, group}, state.async_modules)}
161-
end
162-
163-
{:reply, :ok,
164-
take_modules(%{state | async_groups: async_groups, async_modules: async_modules})}
154+
async_groups = Map.update(state.async_groups, group, names, &(names ++ &1))
155+
{:reply, :ok, take_modules(%{state | async_groups: async_groups})}
165156
end
166157

167158
def handle_call({:add, _async?, _group, _names}, _from, state) do
@@ -174,49 +165,44 @@ defmodule ExUnit.Server do
174165

175166
defp take_modules(%{waiting: {from, count}} = state) do
176167
has_async_modules? = not :queue.is_empty(state.async_modules)
168+
has_async_groups? = map_size(state.async_groups) != 0
177169

178170
cond do
179-
not has_async_modules? and state.loaded == :done ->
171+
not has_async_modules? and not has_async_groups? and state.loaded == :done ->
180172
GenServer.reply(from, nil)
181173
%{state | waiting: nil}
182174

183-
not has_async_modules? ->
184-
state
185-
186-
true ->
187-
{async_modules, remaining_modules} = take_until(count, state.async_modules)
175+
has_async_modules? ->
176+
{reply, remaining_modules} = take_until(count, state.async_modules)
177+
GenServer.reply(from, reply)
178+
%{state | async_modules: remaining_modules, waiting: nil}
188179

189-
{async_modules, remaining_groups} =
190-
Enum.map_reduce(async_modules, state.async_groups, fn
191-
{:module, module}, async_groups ->
192-
{[module], async_groups}
180+
has_async_groups? ->
181+
groups = Enum.take(state.async_groups, count)
193182

194-
{:group, group}, async_groups ->
195-
{group_modules, async_groups} = Map.pop!(async_groups, group)
196-
{Enum.reverse(group_modules), async_groups}
183+
{reply, remaining_groups} =
184+
Enum.map_reduce(groups, state.async_groups, fn {group, entries}, async_groups ->
185+
{entries, Map.delete(async_groups, group)}
197186
end)
198187

199-
GenServer.reply(from, async_modules)
188+
GenServer.reply(from, reply)
189+
%{state | async_groups: remaining_groups, waiting: nil}
200190

201-
%{
202-
state
203-
| async_groups: remaining_groups,
204-
async_modules: remaining_modules,
205-
waiting: nil
206-
}
191+
true ->
192+
state
207193
end
208194
end
209195

210-
# :queue.split fails if the provided count is larger than the queue size;
211-
# as we also want to return the values as a list later, we directly
212-
# return {list, queue} instead of {queue, queue}
196+
# :queue.split fails if the provided count is larger than the queue size.
197+
# We also want to return the values as a list of lists, so we directly
198+
# return {list, queue} instead of {queue, queue}.
213199
defp take_until(n, queue), do: take_until(n, queue, [])
214200

215201
defp take_until(0, queue, acc), do: {Enum.reverse(acc), queue}
216202

217203
defp take_until(n, queue, acc) do
218204
case :queue.out(queue) do
219-
{{:value, item}, queue} -> take_until(n - 1, queue, [item | acc])
205+
{{:value, item}, queue} -> take_until(n - 1, queue, [[item] | acc])
220206
{:empty, queue} -> {Enum.reverse(acc), queue}
221207
end
222208
end

0 commit comments

Comments
 (0)