-module(ebb_worker). -export([start_link/3, start_link/4, stop/1]). -export([worker/3, worker/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) -> Ref = make_ref(), io:format("~p ~p: Worker thread started~n", [Node, Ref]), {_, _, Start} = erlang:now(), ebb_event:return(Receiver, apply(Func, Args)), {_, _, Finish} = erlang:now(), io:format("~p ~p: Worker thread finished, time ~p~n", [Node, Ref, Finish-Start]), ebb_work_manager:work_finished(Root, Node). stop(Worker) -> exit(Worker, kill).