Skip to content

Commit 63aa570

Browse files
Measure each_cycle callback + deadlock detection (#13941)
1 parent 91e76d3 commit 63aa570

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

lib/elixir/lib/kernel/parallel_compiler.ex

+25-14
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)