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 Application.get_env(@app, :timeout)
@times Application.get_env(@app, :times)
@spec sleep(term, module, term) :: :ok
def sleep(server_id, module, reason) do
sleep(server_id, module, reason, @times)
end
## Private functions
# On restarts, wait if server not yet registered...
@spec sleep(term, module, term, non_neg_integer) :: :ok
defp sleep(server_id, _module, reason, 0) do
Log.warn(:remains_unregistered, {server_id, @timeout, @times, reason})
end
defp sleep(server_id, module, reason, times_left) do
Log.info(:still_unregistered, {server_id, @timeout, times_left, reason})
Process.sleep(@timeout)
case server_id |> module.server_name() |> GenServer.whereis() do
pid when is_pid(pid) ->
times = @times - times_left + 1
Log.info(:now_registered, {server_id, @timeout, times, reason, pid})
nil ->
sleep(server_id, module, reason, times_left - 1)
end
end
end