Packages
gen_server_proxy
0.1.72
0.1.72
0.1.71
0.1.70
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Invokes call, cast or stop with a GenServer registered via a server ID. Will wait a bit if the GenServer is not yet registered on restarts.
Current section
Files
Jump to
Current section
Files
lib/gen_server/proxy/timer.ex
defmodule GenServer.Proxy.Timer do
use PersistConfig
alias GenServer.Proxy
alias GenServer.Proxy.Log
@timeout get_env(:timeout)
@times get_env(:times)
@doc """
On restarts, wait if GenServer was killed or is not yet registered.
Note this is an assumption as the GenServer may have never started.
"""
@spec wait(GenServer.name(), Proxy.server_id(), module, non_neg_integer) ::
:ok
def wait(_server, _server_id, _module, 0) do
:ok
end
def wait(server, server_id, module, times_left) do
Process.sleep(@timeout)
times_left = times_left - 1
case GenServer.whereis(server) do
# Note there is no guarantee the returned PID is alive, as a
# process could terminate immediately after it is looked up.
pid when is_pid(pid) ->
times = @times - times_left
now_registered = {server, @timeout, times, pid, __ENV__}
:ok = Log.notice(:now_registered, now_registered)
nil ->
log(server, server_id, module, times_left)
wait(server, server_id, module, times_left)
end
end
## Private functions
@spec log(GenServer.name(), Proxy.server_id(), module, non_neg_integer) :: :ok
defp log(server, server_id, module, 0) do
module.server_unregistered(server_id)
remains_unregistered = {server, @timeout, @times, __ENV__}
:ok = Log.error(:remains_unregistered, remains_unregistered)
end
defp log(server, _server_id, _module, times_left) do
still_unregistered = {server, @timeout, times_left, __ENV__}
:ok = Log.warning(:still_unregistered, still_unregistered)
end
end