@@ -231,29 +231,41 @@ defmodule ExUnit.CaptureServer do
231
231
## :logger handler callback.
232
232
233
233
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
253
247
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 )
254
258
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
257
269
258
270
:ok
259
271
end
0 commit comments