this repo has no description
2
fork

Configure Feed

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

Add Sim.list_nodes and kill_node

garrison 44385b70 905839b9

+46
+21
lib/trinity/scheduler.ex
··· 258 258 :ok 259 259 end 260 260 261 + def handle_kill_node(node, from_pid) do 262 + %{node_procs: node_procs} = sim = get_sim() 263 + [{_node, pids}] = :ets.lookup(node_procs, node) 264 + dbg pids 265 + 266 + # Note: we can ignore links here because we currently only support links on the same node 267 + Enum.each(pids, fn pid -> 268 + # Killing a node from within the node is not currently allowed 269 + # TODO: maybe allow this? 270 + assert pid != from_pid 271 + destroy_process(sim, pid) 272 + 273 + assert Process.alive?(pid) 274 + Process.exit(pid, :kill) 275 + 276 + receive do 277 + {:EXIT, ^pid, _reason} -> :noop 278 + end 279 + end) 280 + end 281 + 261 282 defp destroy_or_message_linked(%Simulation{} = sim, for_pid, reason, visited) do 262 283 linked = 263 284 case :ets.lookup(sim.proc_links, for_pid) do
+9
lib/trinity/scheduler/simulation_supervisor.ex
··· 39 39 GenServer.call(server, {:spawn_child, fun}) 40 40 end 41 41 42 + def kill_node(server, node) do 43 + GenServer.call(server, {:kill_node, node, self()}) 44 + end 45 + 42 46 def init(%{seed: seed, fun: fun, parent_pid: parent_pid, ref: ref}) do 43 47 Process.flag(:trap_exit, true) 44 48 :rand.seed(:exsss, seed) ··· 89 93 def handle_call({:spawn_child, fun}, _from, %State{} = state) do 90 94 pid = spawn_sim_child(state.sim, fun) 91 95 {:reply, pid, state} 96 + end 97 + 98 + def handle_call({:kill_node, node, from_pid}, _from, %State{} = state) do 99 + Trinity.Scheduler.handle_kill_node(node, from_pid) 100 + {:reply, :ok, state} 92 101 end 93 102 94 103 def handle_info({ref, result}, %State{} = state) when ref == state.ref do
+16
lib/trinity/sim.ex
··· 12 12 Trinity.Scheduler.SimulationSupervisor.run_simulation(fun, %{seed: seed}) 13 13 end 14 14 15 + @spec list_nodes :: [atom] 16 + def list_nodes do 17 + %{node_procs: node_procs} = get_sim() 18 + :ets.tab2list(node_procs) 19 + |> Enum.map(fn {node, _pids} -> node end) 20 + |> Enum.reject(&(&1 == :nonode)) 21 + |> Enum.sort() 22 + end 23 + 24 + @spec kill_node(atom) :: :ok 25 + def kill_node(node) do 26 + %{supervisor_pid: supervisor_pid} = get_sim() 27 + Trinity.Scheduler.SimulationSupervisor.kill_node(supervisor_pid, node) 28 + :ok 29 + end 30 + 15 31 @spec simulated? :: boolean 16 32 def simulated? do 17 33 case get_sim() do