diff --git a/lib/trinity/scheduler.ex b/lib/trinity/scheduler.ex index 4cc7b04..f54233d 100644 --- a/lib/trinity/scheduler.ex +++ b/lib/trinity/scheduler.ex @@ -50,10 +50,12 @@ defmodule Trinity.Scheduler do @type t :: %__MODULE__{ trap_exit: boolean, links: [pid], + name_node: atom | nil, } defstruct [ trap_exit: false, links: [], + name_node: nil, ] end @@ -461,9 +463,22 @@ defmodule Trinity.Scheduler do proc_links: proc_links, proc_queue_keys: proc_queue_keys, proc_nodes: proc_nodes, + proc_aliases: proc_aliases, node_procs: node_procs, } = sim + # Remove registered name for process + case :ets.lookup(proc_links, pid) do + [{_key, %ProcInfo{name_node: name_node}}] -> + case name_node do + {_name, _node} = key -> + :ets.delete(proc_aliases, key) + nil -> :noop + end + + [] -> :noop + end + destroy_links(proc_links, pid) destroy_proc_node(proc_nodes, node_procs, pid) # Note that we do not currently bother to destroy aliases here diff --git a/lib/trinity/sim_process.ex b/lib/trinity/sim_process.ex index 28b3285..c2ca1a1 100644 --- a/lib/trinity/sim_process.ex +++ b/lib/trinity/sim_process.ex @@ -183,14 +183,21 @@ defmodule Trinity.SimProcess do end defp sim_register(pid, name) do - %{proc_aliases: proc_aliases} = get_sim() + %{proc_links: proc_links, proc_aliases: proc_aliases} = get_sim() node = get_proc_node() + info = + case :ets.lookup(proc_links, pid) do + [] -> %ProcInfo{} + [{_key, %ProcInfo{} = info}] -> info + end + key = {name, node} - case :ets.lookup(proc_aliases, key) do - [] -> :ets.insert(proc_aliases, {key, pid}) - [{_key, _pid}] -> raise ArgumentError, "Could not register #{inspect(pid)} with name #{inspect(name)}" - end + if info.name_node != nil, do: raise(ArgumentError, "Process #{inspect(pid)} already has a name: #{inspect(info.name_node)}") + if :ets.member(proc_aliases, key), do: raise(ArgumentError, "Name #{inspect(name)} is already registered on node #{inspect(node)}") + + :ets.insert(proc_aliases, {key, pid}) + :ets.insert(proc_links, {pid, %{info | name_node: key}}) true end