@@ -231,29 +231,41 @@ defmodule ExUnit.CaptureServer do
231231 ## :logger handler callback.
232232
233233 def log ( event , _config ) do
234- :ets . tab2list ( @ ets )
235- |> Enum . filter ( fn { _ref , _string_io , level , _formatter_mod , _formatter_config } ->
236- :logger . compare_levels ( event . level , level ) in [ :gt , :eq ]
237- end )
238- |> Enum . group_by (
239- fn { _ref , _string_io , _level , formatter_mod , formatter_config } ->
240- { formatter_mod , formatter_config }
241- end ,
242- fn { _ref , string_io , _level , _formatter_mod , _formatter_config } ->
243- string_io
244- end
245- )
246- |> Enum . map ( fn { { formatter_mod , formatter_config } , string_ios } ->
247- Task . async ( fn ->
248- chardata = formatter_mod . format ( event , formatter_config )
249-
250- # Simply send, do not wait for reply
251- for string_io <- string_ios do
252- 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
253247 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 )
254258 end )
255- end )
256- |> Task . await_many ( :infinity )
259+
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
257269
258270 :ok
259271 end
0 commit comments