Packages
dynamic_supervisor_proxy
0.1.2
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
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.41
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
Starts a module-based dynamic supervisor process with a registered name. Will wait a bit if the supervisor name is still registered on restarts.
Current section
Files
Jump to
Current section
Files
lib/dynamic_supervisor/proxy/agent.ex
defmodule DynamicSupervisor.Proxy.Agent do
use PersistConfig
alias DynamicSupervisor.Proxy.Log
@timeout Application.get_env(@app, :timeout)
@times Application.get_env(@app, :times)
@spec start_link(module, term, GenServer.options()) :: Supervisor.on_start()
def start_link(mod, arg, opts) do
case DynamicSupervisor.start_link(mod, arg, opts) do
{:ok, pid} ->
{:ok, pid}
{:error, {:already_started, _pid} = reason} ->
:ok = wait(opts[:name], reason, @times)
DynamicSupervisor.start_link(mod, arg, opts)
end
end
## Private functions
# On restarts, wait if name still registered...
@spec wait(atom, term, non_neg_integer) :: :ok
defp wait(name, reason, 0) do
Log.warn(:remains_registered, {name, @timeout, @times, reason})
end
defp wait(name, reason, times_left) do
Log.info(:still_registered, {name, @timeout, times_left, reason})
Process.sleep(@timeout)
case Process.whereis(name) do
nil ->
times = @times - times_left + 1
Log.info(:now_unregistered, {name, @timeout, times, reason})
pid when is_pid(pid) ->
wait(name, reason, times_left - 1)
end
end
end