Packages
ace
0.10.0
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.ex
defmodule Ace.Governor do
@moduledoc """
A governor maintains servers ready to handle clients.
A governor process starts a server under the supervision of a server supervisor.
It will then wait until the server has accepted a connection.
Once it's server has accepted a connection the governor will start a new server.
"""
use GenServer
alias Ace.Server
import Server, only: [connection_ack: 2]
@doc """
Start a new governor, linked to the calling process.
"""
@spec start_link(:inet.socket, supervisor) :: {:ok, pid} when
supervisor: pid()
def start_link(listen_socket, server_supervisor) do
GenServer.start_link(__MODULE__, {listen_socket, server_supervisor})
end
## Server callbacks
def init({listen_socket, server_supervisor}) do
{:ok, server} = Supervisor.start_child(server_supervisor, [])
true = Process.link(server)
Process.monitor(server) # Normal exit will stop governor
{:ok, ref} = Server.accept_connection(server, listen_socket)
{:ok, {listen_socket, server_supervisor, ref, server}}
end
def handle_info(connection_ack(ref, _), {listen_socket, server_supervisor, ref, server}) do
true = Process.unlink(server)
{:ok, new_server} = Supervisor.start_child(server_supervisor, [])
true = Process.link(new_server)
Process.monitor(server)
{:ok, new_ref} = Server.accept_connection(new_server, listen_socket)
{:noreply, {listen_socket, server_supervisor, new_ref, new_server}}
end
end