12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- -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).
|