Current section

Files

Jump to
gen_server_proxy lib gen_server proxy timer.ex
Raw

lib/gen_server/proxy/timer.ex

defmodule GenServer.Proxy.Timer do
use PersistConfig
alias GenServer.Proxy.Log
@timeout get_env(:timeout)
@times get_env(:times)
@spec wait(GenServer.name(), term) :: :ok
def wait(server, reason), do: wait(server, reason, @times)
## Private functions
# On restarts, wait if server not yet registered...
@spec wait(GenServer.name(), term, non_neg_integer) :: :ok
defp wait(server, reason, 0) do
remains_unregistered_vars = {server, @timeout, @times, reason, __ENV__}
:ok = Log.warn(:remains_unregistered, remains_unregistered_vars)
end
defp wait(server, reason, times_left) do
still_unregistered_vars = {server, @timeout, times_left, reason, __ENV__}
:ok = Log.info(:still_unregistered, still_unregistered_vars)
Process.sleep(@timeout)
case GenServer.whereis(server) do
pid when is_pid(pid) ->
times = @times - times_left + 1
now_registered_vars = {server, @timeout, times, reason, pid, __ENV__}
:ok = Log.info(:now_registered, now_registered_vars)
nil ->
wait(server, reason, times_left - 1)
end
end
end