Skip to content

Commit

Permalink
v1.51: add init args to startup of dynamic worker
Browse files Browse the repository at this point in the history
  • Loading branch information
James Aimonetti committed Mar 26, 2012
1 parent 89694f2 commit 78c5303
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
Binary file modified lib/poolboy-0.6.1/ebin/poolboy.beam
Binary file not shown.
25 changes: 15 additions & 10 deletions lib/poolboy-0.6.1/src/poolboy.erl
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,11 @@
}).

-spec add_worker(Pool :: node(), fun((Worker :: pid()) -> {ok, pid()})) -> 'ok'.
-spec add_worker(Pool :: node(), fun((Worker :: pid()) -> {ok, pid()}), list()) -> 'ok'.
add_worker(Pool, InitFun) ->
gen_fsm:send_all_state_event(Pool, {add_worker, InitFun}).
add_worker(Pool, InitFun, []).
add_worker(Pool, InitFun, InitArgs) ->
gen_fsm:send_all_state_event(Pool, {add_worker, InitFun, InitArgs}).

-spec rm_worker(Pool :: node(), pid()) -> 'ok'.
rm_worker(Pool, Pid) ->
Expand Down Expand Up @@ -234,11 +237,11 @@ full({checkout, _Block, Timeout}, From, #state{waiting=Waiting}=State) ->
full(_Event, _From, State) ->
{reply, ok, full, State}.

handle_event({add_worker, InitFun}, _StateName, #state{workers=Workers
,worker_sup=Sup
,size=Size
}=State) ->
Workers1 = queue:in(new_worker(Sup, InitFun), Workers),
handle_event({add_worker, InitFun, InitArgs}, _StateName, #state{workers=Workers
,worker_sup=Sup
,size=Size
}=State) ->
Workers1 = queue:in(new_worker(Sup, InitFun, InitArgs), Workers),
{next_state, ready, State#state{workers=Workers1, size=Size+1}};

handle_event({rm_worker, Pid}, StateName, #state{worker_stop=StopFun
Expand Down Expand Up @@ -367,12 +370,14 @@ code_change(_OldVsn, StateName, State, _Extra) ->
{ok, StateName, State}.

new_worker(Sup, InitFun) ->
{ok, Pid} = supervisor:start_child(Sup, []),
new_worker(Sup, InitFun, []).

new_worker(Sup, InitFun, InitArgs) when is_function(InitFun) ->
{ok, Pid} = supervisor:start_child(Sup, InitArgs),
{ok, Pid1} = InitFun(Pid),
link(Pid1),
Pid1.

new_worker(Sup, FromPid, InitFun) ->
Pid1;
new_worker(Sup, FromPid, InitFun) when is_pid(FromPid) ->
Pid = new_worker(Sup, InitFun),
Ref = erlang:monitor(process, FromPid),
{Pid, Ref}.
Expand Down

0 comments on commit 78c5303

Please sign in to comment.