-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
pg2.ex
41 lines (30 loc) · 1.26 KB
/
pg2.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
defmodule Phoenix.PubSub.PG2 do
use Supervisor
@moduledoc """
Phoenix PubSub adapter based on PG2.
To use it as your PubSub adapter, simply add it to your Endpoint's config:
config :my_app, MyApp.Endpoint,
pubsub: [adapter: Phoenix.PubSub.PG2]
## Options
* `:name` - The name to register the PubSub processes, ie: `MyApp.PubSub`
"""
def start_link(name, _opts) do
supervisor_name = Module.concat(name, Supervisor)
Supervisor.start_link(__MODULE__, name, name: supervisor_name)
end
@doc false
def init(server_name) do
local_name = Module.concat(server_name, Local)
# Define a dispatch table so we don't have to go through
# a bottleneck to get the instruction to perform.
:ets.new(server_name, [:set, :named_table, read_concurrency: true])
true = :ets.insert(server_name, {:broadcast, Phoenix.PubSub.PG2Server, [server_name, local_name]})
true = :ets.insert(server_name, {:subscribe, Phoenix.PubSub.Local, [local_name]})
true = :ets.insert(server_name, {:unsubscribe, Phoenix.PubSub.Local, [local_name]})
children = [
worker(Phoenix.PubSub.Local, [local_name]),
worker(Phoenix.PubSub.PG2Server, [server_name, local_name]),
]
supervise children, strategy: :rest_for_one
end
end