Skip to content

Commit 25576cc

Browse files
committed
don't change trap_exit, just consume messages
1 parent e7dfd84 commit 25576cc

File tree

1 file changed

+32
-24
lines changed

1 file changed

+32
-24
lines changed

lib/ex_unit/lib/ex_unit/capture_server.ex

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -231,33 +231,41 @@ defmodule ExUnit.CaptureServer do
231231
## :logger handler callback.
232232

233233
def log(event, _config) do
234-
trap_exits = Process.flag(:trap_exit, false)
235-
236-
:ets.tab2list(@ets)
237-
|> Enum.filter(fn {_ref, _string_io, level, _formatter_mod, _formatter_config} ->
238-
:logger.compare_levels(event.level, level) in [:gt, :eq]
239-
end)
240-
|> Enum.group_by(
241-
fn {_ref, _string_io, _level, formatter_mod, formatter_config} ->
242-
{formatter_mod, formatter_config}
243-
end,
244-
fn {_ref, string_io, _level, _formatter_mod, _formatter_config} ->
245-
string_io
246-
end
247-
)
248-
|> Enum.map(fn {{formatter_mod, formatter_config}, string_ios} ->
249-
Task.async(fn ->
250-
chardata = formatter_mod.format(event, formatter_config)
251-
252-
# Simply send, do not wait for reply
253-
for string_io <- string_ios do
254-
send(string_io, {:io_request, self(), make_ref(), {:put_chars, :unicode, chardata}})
234+
{:trap_exit, trapping_exits?} = Process.info(self(), :trap_exit)
235+
236+
tasks =
237+
:ets.tab2list(@ets)
238+
|> Enum.filter(fn {_ref, _string_io, level, _formatter_mod, _formatter_config} ->
239+
:logger.compare_levels(event.level, level) in [:gt, :eq]
240+
end)
241+
|> Enum.group_by(
242+
fn {_ref, _string_io, _level, formatter_mod, formatter_config} ->
243+
{formatter_mod, formatter_config}
244+
end,
245+
fn {_ref, string_io, _level, _formatter_mod, _formatter_config} ->
246+
string_io
255247
end
248+
)
249+
|> Enum.map(fn {{formatter_mod, formatter_config}, string_ios} ->
250+
Task.async(fn ->
251+
chardata = formatter_mod.format(event, formatter_config)
252+
253+
# Simply send, do not wait for reply
254+
for string_io <- string_ios do
255+
send(string_io, {:io_request, self(), make_ref(), {:put_chars, :unicode, chardata}})
256+
end
257+
end)
256258
end)
257-
end)
258-
|> Task.await_many(:infinity)
259259

260-
Process.flag(:trap_exit, trap_exits)
260+
Task.await_many(tasks)
261+
262+
if trapping_exits? do
263+
for %{pid: pid} <- tasks do
264+
receive do
265+
{:EXIT, ^pid, _} -> :ok
266+
end
267+
end
268+
end
261269

262270
:ok
263271
end

0 commit comments

Comments
 (0)