-module(ebb_worker). -export([start_link/3, start_link/4, stop/1]). -export([worker/3, worker/5]). -export([worker_traced/3, worker_traced/5]). start_link(Func, Args, Receiver) -> try spawn_link(?MODULE, worker, [Func, Args, Receiver]) of Pid -> {ok, Pid} catch Error -> Error end. start_link(distributed, Func, Args, Receiver) -> Node = ebb_work_manager:available_node(), start_link(node(), Node, Func, Args, Receiver). start_link(Root, Node, Func, Args, Receiver) -> try Result = spawn_link(Node, ?MODULE, worker, [Root, Node, Func, Args, Receiver]), ebb_work_manager:start_work(Node), Result of Pid -> {ok, Pid} catch Error -> Error end. worker(Func, Args, Receiver) -> ebb_event:return(Receiver, apply(Func, Args)). worker(Root, Node, Func, Args, Receiver) -> ebb_event:return(Receiver, apply(Func, Args)), ebb_work_manager:work_finished(Root, Node). trace(Node, Worker, Args) -> Ref = make_ref(), io:format("~p<< ~p worker thread start~n", [Node, Ref]), {_, _, Start} = erlang:now(), apply(Worker, Args), {_, _, Finish} = erlang:now(), io:format("~p>> ~p worker thread finish (~p usec)~n", [Node, Ref, Finish-Start]). worker_traced(Func, Args, Receiver) -> trace(node(), fun worker/3, [Func, Args, Receiver]). worker_traced(Root, Node, Func, Args, Receiver) -> trace(Node, fun worker/5, [Root, Node, Func, Args, Receiver]). stop(Worker) -> exit(Worker, kill).