diff --git a/lib/trinity/scheduler.ex b/lib/trinity/scheduler.ex index f54233d..b23337e 100644 --- a/lib/trinity/scheduler.ex +++ b/lib/trinity/scheduler.ex @@ -313,33 +313,40 @@ defmodule Trinity.Scheduler do visited = Enum.reduce(linked, visited, fn p, visited -> MapSet.put(visited, p) end) Enum.reduce(linked, visited, fn p, visited -> - visited = destroy_or_message_linked(sim, p, reason, visited) - destroy_or_message(sim, p, for_pid, reason) - visited + case trapping_exits?(sim.proc_links, p) do + true -> + :ok = message_linked(p, for_pid, reason) + visited + false -> + visited = destroy_or_message_linked(sim, p, reason, visited) + :ok = destroy_linked(sim, p, reason) + visited + end end) end - defp destroy_or_message(%Simulation{} = sim, pid, from_pid, reason) do - trap_exit = - case :ets.lookup(sim.proc_links, pid) do - [{_key, %ProcInfo{trap_exit: trap_exit}}] -> trap_exit - [] -> false - end + defp trapping_exits?(proc_links, pid) do + case :ets.lookup(proc_links, pid) do + [{_key, %ProcInfo{trap_exit: trap_exit}}] -> trap_exit + [] -> false + end + end - case trap_exit do - true -> - send pid, {:EXIT, from_pid, reason} - handle_sent(pid) + defp message_linked(pid, from_pid, reason) do + send pid, {:EXIT, from_pid, reason} + handle_sent(pid) + :ok + end - false -> - destroy_process(sim, pid) + defp destroy_linked(%Simulation{} = sim, pid, reason) do + destroy_process(sim, pid) - assert Process.alive?(pid) - Process.exit(pid, reason) - receive do - {:EXIT, ^pid, _reason} -> :noop - end + assert Process.alive?(pid) + Process.exit(pid, reason) + receive do + {:EXIT, ^pid, _reason} -> :noop end + :ok end def handle_sent(dest_pid) when is_pid(dest_pid) do