@@ -475,7 +475,7 @@ defmodule Kernel.ParallelCompiler do
475
475
end )
476
476
477
477
[ ] = 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 )
479
479
state = cycle_timing ( result , state )
480
480
481
481
case cycle_return do
@@ -519,21 +519,23 @@ defmodule Kernel.ParallelCompiler do
519
519
# Finally, note there is no difference between hard and raise, the
520
520
# difference is where the raise is happening, inside the compiler
521
521
# 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 )
523
524
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 )
529
530
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 )
537
539
end
538
540
539
541
# No more queue, but spawned and map_size(waiting) do not match
@@ -558,6 +560,15 @@ defmodule Kernel.ParallelCompiler do
558
560
end
559
561
end
560
562
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
+
561
572
defp cycle_timing ( _result , % { profile: :none } = state ) do
562
573
state
563
574
end
0 commit comments