@@ -475,7 +475,7 @@ defmodule Kernel.ParallelCompiler do
475475 end )
476476
477477 [ ] = files
478- cycle_return = each_cycle_return ( state . each_cycle . ( ) )
478+ cycle_return = measure_timing ( state , "each_cycle callback" , fn -> each_cycle_return ( state . each_cycle . ( ) ) end )
479479 state = cycle_timing ( result , state )
480480
481481 case cycle_return do
@@ -519,21 +519,23 @@ defmodule Kernel.ParallelCompiler do
519519 # Finally, note there is no difference between hard and raise, the
520520 # difference is where the raise is happening, inside the compiler
521521 # or in the caller.
522- waiting_list = Map . to_list ( waiting )
522+ measure_timing ( state , "spawn_workers/8 in potential deadlock situation" , fn ->
523+ waiting_list = Map . to_list ( waiting )
523524
524- deadlocked =
525- deadlocked ( waiting_list , :soft , false ) ||
526- deadlocked ( waiting_list , :soft , true ) ||
527- deadlocked ( waiting_list , :hard , false ) ||
528- without_definition ( waiting_list , files )
525+ deadlocked =
526+ deadlocked ( waiting_list , :soft , false ) ||
527+ deadlocked ( waiting_list , :soft , true ) ||
528+ deadlocked ( waiting_list , :hard , false ) ||
529+ without_definition ( waiting_list , files )
529530
530- if deadlocked do
531- spawn_workers ( deadlocked , spawned , waiting , files , result , warnings , errors , state )
532- else
533- return_error ( warnings , errors , state , fn ->
534- handle_deadlock ( waiting , files )
535- end )
536- end
531+ if deadlocked do
532+ spawn_workers ( deadlocked , spawned , waiting , files , result , warnings , errors , state )
533+ else
534+ return_error ( warnings , errors , state , fn ->
535+ handle_deadlock ( waiting , files )
536+ end )
537+ end
538+ end )
537539 end
538540
539541 # No more queue, but spawned and map_size(waiting) do not match
@@ -558,6 +560,15 @@ defmodule Kernel.ParallelCompiler do
558560 end
559561 end
560562
563+ defp measure_timing ( % { profile: :none } , _what , fun ) , do: fun . ( )
564+ defp measure_timing ( % { profile: { :time , _ , _ } } , what , fun ) do
565+ { time , result } = :timer . tc ( fun )
566+ time = div ( time , 1000 )
567+
568+ IO . puts ( :stderr , "[profile] Executed #{ what } in #{ time } ms" )
569+ result
570+ end
571+
561572 defp cycle_timing ( _result , % { profile: :none } = state ) do
562573 state
563574 end
0 commit comments