|
|
@ -18,6 +18,7 @@ |
|
|
|
]). |
|
|
|
|
|
|
|
-define(SERVER, ?MODULE). |
|
|
|
-define(TickCheck, 10000). %% 10秒检车一次各个工厂的状态 |
|
|
|
|
|
|
|
%% ******************************************** API ******************************************************************* |
|
|
|
start_link() -> |
|
|
@ -25,6 +26,7 @@ start_link() -> |
|
|
|
|
|
|
|
%% ******************************************** callback ************************************************************** |
|
|
|
init(_Args) -> |
|
|
|
erlang:send_after(?TickCheck, self(), mTickCheck), |
|
|
|
{ok, #{}}. |
|
|
|
|
|
|
|
handleCall({mNewQueue, FName}, _State, _FROM) -> |
|
|
@ -62,22 +64,40 @@ handleInfo({mChAwkW, FName}, State) -> |
|
|
|
#{FName := PidList} -> |
|
|
|
case PidList of |
|
|
|
[OnePid | LeftList] -> |
|
|
|
NewState = State#{FName := LeftList}, |
|
|
|
gen_srv:send(OnePid, tryWork), |
|
|
|
{noreply, NewState}; |
|
|
|
case erlang:is_process_alive(OnePid) of |
|
|
|
true -> |
|
|
|
NewState = State#{FName := LeftList}, |
|
|
|
gen_srv:send(OnePid, mTryWork), |
|
|
|
{noreply, NewState}; |
|
|
|
_ -> |
|
|
|
NewState = State#{FName := LeftList}, |
|
|
|
handleInfo({mChAwkW, FName}, NewState) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
kpS |
|
|
|
{noreply, State} |
|
|
|
end |
|
|
|
end; |
|
|
|
handleInfo(mTickCheck, State) -> |
|
|
|
NewState = tickCheck(State), |
|
|
|
erlang:send_after(?TickCheck, self(), mTickCheck), |
|
|
|
{noreply, NewState}; |
|
|
|
handleInfo({mWSleep, FName, Pid}, State) -> |
|
|
|
NewState = |
|
|
|
case State of |
|
|
|
#{FName := OldList} -> |
|
|
|
State#{FName := [Pid | OldList]}; |
|
|
|
case lists:member(Pid, OldList) of |
|
|
|
true -> |
|
|
|
State; |
|
|
|
_ -> |
|
|
|
State#{FName := [Pid | OldList]} |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
State#{FName => [Pid]} |
|
|
|
end, |
|
|
|
{noreply, NewState}; |
|
|
|
handleInfo({mTWOver, FName, Pid}, State) -> |
|
|
|
supervisor:terminate_child(FName, Pid), |
|
|
|
{noreply, State}; |
|
|
|
handleInfo(_Msg, _State) -> |
|
|
|
?ERR("~p info receive unexpect msg ~p ~n ", [?MODULE, _Msg]), |
|
|
|
kpS. |
|
|
@ -87,3 +107,30 @@ terminate(_Reason, _State) -> |
|
|
|
|
|
|
|
code_change(_OldVsn, State, _Extra) -> |
|
|
|
{ok, State}. |
|
|
|
|
|
|
|
tickCheck(State) -> |
|
|
|
tickCheck(maps:iterator(State), State). |
|
|
|
|
|
|
|
tickCheck(Iterator, State) -> |
|
|
|
case maps:next(Iterator) of |
|
|
|
{FName, IdleList, NextIter} -> |
|
|
|
TaskLen = fwQueue:size(FName), |
|
|
|
WFCnt = FName:getV(?wFCnt), |
|
|
|
IdleCnt = length(IdleList), |
|
|
|
|
|
|
|
TemState = |
|
|
|
if |
|
|
|
IdleCnt > 0 andalso TaskLen >= WFCnt -> |
|
|
|
[gen_srv:send(OnePid, mTryWork) || OnePid <- IdleList], |
|
|
|
State#{FName := []}; |
|
|
|
TaskLen > 0 andalso WFCnt == IdleCnt -> |
|
|
|
[gen_srv:send(OnePid, mTryWork) || OnePid <- IdleList], |
|
|
|
State#{FName := []}; |
|
|
|
true -> |
|
|
|
State |
|
|
|
end, |
|
|
|
tickCheck(NextIter, TemState); |
|
|
|
none -> |
|
|
|
State |
|
|
|
end. |
|
|
|
|