this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix link exits propagating through trap_exit

garrison f5051a1f f7c2ed6c

+27 -20
+27 -20
lib/trinity/scheduler.ex
··· 313 313 314 314 visited = Enum.reduce(linked, visited, fn p, visited -> MapSet.put(visited, p) end) 315 315 Enum.reduce(linked, visited, fn p, visited -> 316 - visited = destroy_or_message_linked(sim, p, reason, visited) 317 - destroy_or_message(sim, p, for_pid, reason) 318 - visited 316 + case trapping_exits?(sim.proc_links, p) do 317 + true -> 318 + :ok = message_linked(p, for_pid, reason) 319 + visited 320 + false -> 321 + visited = destroy_or_message_linked(sim, p, reason, visited) 322 + :ok = destroy_linked(sim, p, reason) 323 + visited 324 + end 319 325 end) 320 326 end 321 327 322 - defp destroy_or_message(%Simulation{} = sim, pid, from_pid, reason) do 323 - trap_exit = 324 - case :ets.lookup(sim.proc_links, pid) do 325 - [{_key, %ProcInfo{trap_exit: trap_exit}}] -> trap_exit 326 - [] -> false 327 - end 328 + defp trapping_exits?(proc_links, pid) do 329 + case :ets.lookup(proc_links, pid) do 330 + [{_key, %ProcInfo{trap_exit: trap_exit}}] -> trap_exit 331 + [] -> false 332 + end 333 + end 328 334 329 - case trap_exit do 330 - true -> 331 - send pid, {:EXIT, from_pid, reason} 332 - handle_sent(pid) 335 + defp message_linked(pid, from_pid, reason) do 336 + send pid, {:EXIT, from_pid, reason} 337 + handle_sent(pid) 338 + :ok 339 + end 333 340 334 - false -> 335 - destroy_process(sim, pid) 341 + defp destroy_linked(%Simulation{} = sim, pid, reason) do 342 + destroy_process(sim, pid) 336 343 337 - assert Process.alive?(pid) 338 - Process.exit(pid, reason) 339 - receive do 340 - {:EXIT, ^pid, _reason} -> :noop 341 - end 344 + assert Process.alive?(pid) 345 + Process.exit(pid, reason) 346 + receive do 347 + {:EXIT, ^pid, _reason} -> :noop 342 348 end 349 + :ok 343 350 end 344 351 345 352 def handle_sent(dest_pid) when is_pid(dest_pid) do