-module(eFaw).
|
|
|
|
-include("eFaw.hrl").
|
|
|
|
-export([
|
|
start/0 %% start app
|
|
, stop/0 %% stop app
|
|
, openF/2 %% Open a factory
|
|
, closeF/1 %% close a factory
|
|
, hireW/3 %% hire worker
|
|
, inWork/2 %% Insert async task
|
|
, inWorks/2 %% Insert async tasks
|
|
, syncWork/4 %% Insert sync task And wait for the result to receive
|
|
]).
|
|
|
|
start() ->
|
|
application:ensure_all_started(eFaw).
|
|
|
|
stop() ->
|
|
application:stop(eFaw).
|
|
|
|
openF(FName, Kvs) ->
|
|
fwKvsToBeam:load(FName, fwUtil:initCfg(Kvs)),
|
|
FChildSpec = #{
|
|
id => FName,
|
|
start => {fwWSup, start_link, [FName, FName:getV(?wMod)]},
|
|
restart => permanent,
|
|
shutdown => 300000,
|
|
type => supervisor,
|
|
modules => [fwWSup]
|
|
},
|
|
case supervisor:start_child(eFaw_sup, FChildSpec) of
|
|
{ok, _Pid} = Ret ->
|
|
io:format("IMY************** ~p~n", [Ret]),
|
|
fwFMgr:newQueue(FName),
|
|
hireW(FName:getV(?wFCnt), FName, false),
|
|
Ret;
|
|
ErrRet ->
|
|
?FwErr("open factory error ~p~n", [ErrRet]),
|
|
ErrRet
|
|
end.
|
|
|
|
hireW(WorkerNum, FName, IsTmp) when is_integer(WorkerNum), WorkerNum > 0 ->
|
|
case supervisor:start_child(FName, [IsTmp]) of
|
|
{ok, _Pid} ->
|
|
ignore;
|
|
ErrRet ->
|
|
?FwErr("hire worker error ~p~n", [ErrRet])
|
|
end,
|
|
hireW(WorkerNum - 1, FName, IsTmp);
|
|
hireW(_WorkerNum, _FName, _IsTmp) ->
|
|
ok.
|
|
|
|
closeF(FName) ->
|
|
supervisor:terminate_child(eFaw_sup, FName),
|
|
supervisor:delete_child(eFaw_sup, FName),
|
|
fwFMgr:delQueue(FName).
|
|
|
|
-spec inWork(FName :: atom(), Work :: term()) -> true | false.
|
|
inWork(FName, Work) ->
|
|
% fwQueue:in(FName, Work).
|
|
FTaskLen = fwQueue:size(FName),
|
|
FTMax = FName:getV(?fTMax),
|
|
FTLfl = FName:getV(?fTLfl),
|
|
WFCnt = FName:getV(?wFCnt),
|
|
if
|
|
FTaskLen > FTMax ->
|
|
%% The factory is overloaded
|
|
false;
|
|
FTaskLen == FTLfl ->
|
|
%% See factory if need to hire hourly worker
|
|
%io:format("IMY*****************try addddddddd~n"),
|
|
fwFMgr:chAddW(FName),
|
|
fwQueue:in(FName, Work);
|
|
FTaskLen < WFCnt ->
|
|
%% See if need to wake up idle workers
|
|
fwFMgr:chAwkW(FName),
|
|
fwQueue:in(FName, Work);
|
|
true ->
|
|
fwQueue:in(FName, Work)
|
|
end.
|
|
|
|
-spec inWorks(FName :: atom(), Works :: [term(), ...]) -> true | false.
|
|
inWorks(FName, Works) ->
|
|
FTaskLen = fwQueue:size(FName),
|
|
FTMax = FName:getV(?fTMax),
|
|
FTLfl = FName:getV(?fTLfl),
|
|
WFCnt = FName:getV(?wFCnt),
|
|
if
|
|
FTaskLen > FTMax ->
|
|
%% The factory is overloaded.
|
|
false;
|
|
FTaskLen == FTLfl ->
|
|
%% See factory if need to hire hourly worker
|
|
fwFMgr:chAddW(FName),
|
|
fwQueue:ins(FName, Works);
|
|
FTaskLen < WFCnt ->
|
|
%% See if need to wake up idle workers
|
|
fwFMgr:chAwkW(FName),
|
|
fwQueue:ins(FName, Works);
|
|
true ->
|
|
fwQueue:ins(FName, Works)
|
|
end.
|
|
|
|
-spec syncWork(FName :: atom(), RetTag :: atom(), Timeout :: pos_integer() | infinity, Work :: term()) -> true | false.
|
|
syncWork(FName, RetTag, Timeout, Work) ->
|
|
FTaskLen = fwQueue:size(FName),
|
|
FTMax = FName:getV(?fTMax),
|
|
FTLfl = FName:getV(?fTLfl),
|
|
WFCnt = FName:getV(?wFCnt),
|
|
if
|
|
FTaskLen > FTMax ->
|
|
%% The factory is overloaded.
|
|
false;
|
|
FTaskLen == FTLfl ->
|
|
%% See factory if need to hire hourly worker
|
|
fwFMgr:chAddW(FName),
|
|
fwQueue:in(FName, Work),
|
|
receive
|
|
{RetTag, Ret} ->
|
|
Ret
|
|
after Timeout ->
|
|
timeout
|
|
end;
|
|
FTaskLen < WFCnt ->
|
|
%% See if need to wake up idle workers
|
|
fwFMgr:chAwkW(FName),
|
|
fwQueue:in(FName, Work),
|
|
receive
|
|
{RetTag, Ret} ->
|
|
Ret
|
|
after Timeout ->
|
|
timeout
|
|
end;
|
|
true ->
|
|
fwQueue:in(FName, Work),
|
|
receive
|
|
{RetTag, Ret} ->
|
|
Ret
|
|
after Timeout ->
|
|
timeout
|
|
end
|
|
end.
|
|
|
|
|