Packages
dynamic_supervisor_proxy
0.1.15
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/broker.ex
defmodule DynamicSupervisor.Proxy.Broker do
use PersistConfig
alias DynamicSupervisor.Proxy.Log
@timeout get_env(:timeout)
@times get_env(: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)
{:ok, _pid} = 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
remains_registered_vars = {name, @timeout, @times, reason, __ENV__}
:ok = Log.warn(:remains_registered, remains_registered_vars)
end
defp wait(name, reason, times_left) do
still_registered_vars = {name, @timeout, times_left, reason, __ENV__}
:ok = Log.info(:still_registered, still_registered_vars)
Process.sleep(@timeout)
case Process.whereis(name) do
nil ->
times = @times - times_left + 1
now_unregistered_vars = {name, @timeout, times, reason, __ENV__}
:ok = Log.info(:now_unregistered, now_unregistered_vars)
pid when is_pid(pid) ->
wait(name, reason, times_left - 1)
end
end
end