@@ -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