Packages
exq
0.20.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.2
0.12.1
0.12.0
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.2
Exq is a job processing library compatible with Resque / Sidekiq for the Elixir language.
Current section
Files
Jump to
Current section
Files
lib/exq/worker/metadata.ex
defmodule Exq.Worker.Metadata do
@moduledoc """
Provides storage functionality for job metadata.
The metadata is associated with the worker pid and automatically discarded
when the worker process exits.
"""
use GenServer
alias Exq.Support.Config
def start_link(opts) do
GenServer.start_link(__MODULE__, opts, name: server_name(opts[:name]))
end
def associate(server, pid, value) when is_pid(pid) do
GenServer.call(server, {:associate, pid, value})
end
def lookup(server, pid) when is_pid(pid) do
:ets.lookup_element(server, pid, 3)
end
## ===========================================================
## GenServer callbacks
## ===========================================================
def init(opts) do
table = :ets.new(server_name(opts[:name]), [:named_table])
{:ok, table}
end
def handle_call({:associate, pid, value}, _from, table) do
ref = Process.monitor(pid)
true = :ets.insert(table, {pid, ref, value})
{:reply, :ok, table}
end
def handle_info({:DOWN, ref, _type, pid, _reason}, table) do
[{^pid, ^ref, _}] = :ets.lookup(table, pid)
true = :ets.delete(table, pid)
{:noreply, table}
end
def handle_info(_msg, state) do
{:noreply, state}
end
# Internal Functions
def server_name(name) do
name = name || Config.get(:name)
"#{name}.Worker.Metadata" |> String.to_atom()
end
end