this repo has no description
2
fork

Configure Feed

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

Add aliases

garrison ee0081ea 71f03a7b

+65 -8
+8
lib/trinity/scheduler.ex
··· 2 2 alias Trinity.Scheduler.SimulationSupervisor 3 3 4 4 defmodule Simulation do 5 + @type t :: %__MODULE__{ 6 + queue: :ets.table, 7 + proc_queue_keys: :ets.table, 8 + proc_links: :ets.table, 9 + now: :atomics.atomics_ref, 10 + supervisor_pid: pid, 11 + } 5 12 @enforce_keys [ 6 13 :queue, 7 14 :proc_queue_keys, 8 15 :proc_links, 16 + :proc_aliases, 9 17 :now, 10 18 :supervisor_pid, 11 19 ]
+1
lib/trinity/scheduler/simulation_supervisor.ex
··· 40 40 queue: :ets.new(__MODULE__, [:ordered_set, :public]), 41 41 proc_queue_keys: :ets.new(__MODULE__, [:set, :public]), 42 42 proc_links: :ets.new(__MODULE__, [:set, :public]), 43 + proc_aliases: :ets.new(__MODULE__, [:set, :public]), 43 44 now: :atomics.new(1, signed: false), 44 45 supervisor_pid: self(), 45 46 }
+4 -4
lib/trinity/sim_gen.ex
··· 1 1 defmodule Trinity.SimGen do 2 - alias Trinity.{Scheduler, Sim} 2 + alias Trinity.{Scheduler, SimProcess} 3 3 4 4 import Trinity.Scheduler, only: [receive_yield: 1] 5 5 ··· 27 27 defp initialize(module, init_arg, parent_pid) do 28 28 case module.init(init_arg) do 29 29 {:ok, state} -> 30 - Sim.send parent_pid, {:ack, self()} 30 + SimProcess.send parent_pid, {:ack, self()} 31 31 loop(module, state) 32 32 end 33 33 end ··· 39 39 loop(module, state) 40 40 end 41 41 42 - defp dispatch({:"$sim_call", {from_pid, [:alias | _] = tag} = from, request}, module, state) do 42 + defp dispatch({:"$sim_call", {_pid, [:alias | alias] = tag} = from, request}, module, state) do 43 43 try do 44 44 module.handle_call(request, from, state) 45 45 catch ··· 49 49 end 50 50 |> case do 51 51 {:reply, response, state} -> 52 - Sim.send(from_pid, {tag, response}) 52 + SimProcess.send alias, {tag, response} 53 53 state 54 54 {:noreply, state} -> 55 55 state
+44
lib/trinity/sim_process.ex
··· 1 + defmodule Trinity.SimProcess do 2 + alias Trinity.Scheduler.Simulation 3 + 4 + import Trinity.Scheduler, only: [simulation_key: 0] 5 + 6 + @spec get_sim :: Simulation.t | nil 7 + defp get_sim, do: Process.get(simulation_key()) 8 + 9 + def send(dest, message) do 10 + Kernel.send(dest, message) 11 + end 12 + 13 + @spec alias :: reference 14 + def alias do 15 + case get_sim() do 16 + nil -> Process.alias() 17 + _sim -> sim_alias() 18 + end 19 + end 20 + 21 + defp sim_alias do 22 + %Simulation{proc_aliases: proc_aliases} = get_sim() 23 + 24 + alias = Process.alias() 25 + :ets.insert(proc_aliases, {alias, self()}) 26 + 27 + alias 28 + end 29 + 30 + @spec unalias(reference) :: boolean 31 + def unalias(alias) do 32 + case get_sim() do 33 + nil -> Process.unalias(alias) 34 + _sim -> sim_unalias(alias) 35 + end 36 + end 37 + 38 + defp sim_unalias(alias) do 39 + %Simulation{proc_aliases: proc_aliases} = get_sim() 40 + :ets.delete(proc_aliases, alias) 41 + 42 + Process.unalias(alias) 43 + end 44 + end
+8 -4
lib/trinity/sim_server.ex
··· 1 1 defmodule Trinity.SimServer do 2 - alias Trinity.{Sim, SimGen} 2 + alias Trinity.{SimProcess, SimGen} 3 3 4 4 import Trinity.Scheduler, only: [simulation_key: 0, receive_yield: 1] 5 5 ··· 20 20 @dialyzer {:no_improper_lists, sim_call: 3} 21 21 defp sim_call(server, request, timeout) do 22 22 # TODO: real alias 23 - tag = [:alias | make_ref()] 23 + alias = SimProcess.alias() 24 + tag = [:alias | alias] 24 25 25 - Sim.send server, {:"$sim_call", {self(), tag}, request} 26 + SimProcess.send server, {:"$sim_call", {self(), tag}, request} 26 27 27 - receive_yield do 28 + result = receive_yield do 28 29 {^tag, response} -> response 29 30 after 30 31 # TODO 31 32 timeout -> raise "timeout" 32 33 end 34 + 35 + SimProcess.unalias(alias) 36 + result 33 37 end 34 38 35 39 @spec cast(GenServer.server, term) :: :ok