zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

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