task.ex (1222B)
1 defmodule DBConnection.Task do 2 @moduledoc false 3 @name __MODULE__ 4 5 require DBConnection.Holder 6 7 def run_child(mod, state, fun, opts) do 8 arg = [fun, self(), opts] 9 {:ok, pid} = Task.Supervisor.start_child(@name, __MODULE__, :init, arg) 10 ref = Process.monitor(pid) 11 _ = DBConnection.Holder.update(pid, ref, mod, state) 12 {pid, ref} 13 end 14 15 def init(fun, parent, opts) do 16 try do 17 Process.link(parent) 18 catch 19 :error, :noproc -> 20 exit({:shutdown, :noproc}) 21 end 22 23 receive do 24 {:"ETS-TRANSFER", holder, ^parent, {:checkin, ref, _extra}} -> 25 Process.unlink(parent) 26 pool_ref = DBConnection.Holder.pool_ref(pool: parent, reference: ref, holder: holder) 27 checkout = {:via, __MODULE__, pool_ref} 28 _ = DBConnection.run(checkout, make_fun(fun), [pool: __MODULE__] ++ opts) 29 exit(:normal) 30 end 31 end 32 33 def checkout({:via, __MODULE__, pool_ref}, _callers, _opts) do 34 {:ok, pool_ref, _mod = :unused, _idle_time = nil, _state = :unused} 35 end 36 37 defp make_fun(fun) when is_function(fun, 1) do 38 fun 39 end 40 41 defp make_fun(mfargs) do 42 fn conn -> 43 {mod, fun, args} = mfargs 44 apply(mod, fun, [conn | args]) 45 end 46 end 47 end