Packages
ace
0.15.2
0.19.0
0.18.10
0.18.9
0.18.8
0.18.7
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
retired
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
retired
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
HTTP web server and client, supports http1 and http2
Current section
Files
Jump to
Current section
Files
lib/ace/governor/supervisor.ex
# TODO remove in breaking update
defmodule Ace.Governor.Supervisor do
@moduledoc """
Supervise governors to maintain a pool of accepting servers.
"""
use Supervisor
@doc """
Starts a supervised pool of governor processes.
"""
@spec start_link(pid, Ace.Connection.connection(), non_neg_integer) :: {:ok, pid}
def start_link(server_supervisor, listen_socket, acceptors) do
{:ok, supervisor} = Supervisor.start_link(__MODULE__, {server_supervisor, listen_socket}, [])
# To speed up a server multiple process can be listening for a connection simultaneously.
# In this case n Governors will start n Servers listening before a single connection is received.
for _index <- 1..acceptors do
Supervisor.start_child(supervisor, [])
end
{:ok, supervisor}
end
def drain(supervisor) do
Supervisor.which_children(supervisor)
|> Enum.map(fn {_i, pid, :worker, _} ->
ref = Process.monitor(pid)
true = Process.exit(pid, :shutdown)
ref
end)
|> Enum.map(fn ref ->
receive do
{:DOWN, ^ref, :process, _pid, _reason} ->
:ok
end
end)
:ok
end
## SERVER CALLBACKS
def init({server_supervisor, listen_socket}) do
children = [
worker(Ace.Governor, [listen_socket, server_supervisor], restart: :transient)
]
supervise(children, strategy: :simple_one_for_one)
end
end