-module(fwUtil).
|
|
|
|
-include("eFaw.hrl").
|
|
|
|
-export([
|
|
initCfg/1
|
|
, initWParam/2
|
|
, tryWorkOnce/2
|
|
, tryWorkLoop/2
|
|
]).
|
|
|
|
initCfg(Kvs) ->
|
|
[
|
|
begin
|
|
case lists:keyfind(Key, 1, Kvs) of
|
|
false ->
|
|
{Key, DefV};
|
|
Tuple ->
|
|
Tuple
|
|
end
|
|
end
|
|
|| {Key, DefV} <- ?FawDefV
|
|
].
|
|
|
|
initWParam(FName, IsTmp) ->
|
|
#wParam{fName = FName, fNameTid = persistent_term:get(FName), mod = FName:getV(?wMod), isTmp = IsTmp}.
|
|
|
|
tryWorkOnce(#wParam{fName = FName, fNameTid = FNameTid, mod = Mod, isTmp = IsTmp}, State) ->
|
|
Task = eLfq:tryOut(FNameTid),
|
|
case Task of
|
|
lfq_empty ->
|
|
case IsTmp of
|
|
false ->
|
|
fwFMgr:wSleep(FName, self()),
|
|
case erlang:function_exported(Mod, idle, 1) of
|
|
true ->
|
|
Mod:idle(State);
|
|
_ ->
|
|
State
|
|
end;
|
|
_ ->
|
|
fwFMgr:tWOver(FName, self()),
|
|
case erlang:function_exported(Mod, close, 1) of
|
|
true ->
|
|
Mod:close(State);
|
|
_ ->
|
|
State
|
|
end
|
|
end;
|
|
_ ->
|
|
try Mod:work(Task, State) of
|
|
NewState ->
|
|
NewState
|
|
catch
|
|
C:R:S ->
|
|
?FwErr("woker do task error ~p ~p ~p ~p ~p ~n", [FName, Mod, IsTmp, self(), {C, R, S}]),
|
|
State
|
|
end
|
|
end.
|
|
|
|
tryWorkLoop(#wParam{fName = FName, fNameTid = FNameTid, mod = Mod, isTmp = IsTmp} = WParam, State) ->
|
|
Task = eLfq:tryOut(FNameTid),
|
|
case Task of
|
|
lfq_empty ->
|
|
case IsTmp of
|
|
false ->
|
|
fwFMgr:wSleep(FName, self()),
|
|
case erlang:function_exported(Mod, idle, 1) of
|
|
true ->
|
|
Mod:idle(State);
|
|
_ ->
|
|
State
|
|
end;
|
|
_ ->
|
|
fwFMgr:tWOver(FName, self()),
|
|
case erlang:function_exported(Mod, close, 1) of
|
|
true ->
|
|
Mod:close(State);
|
|
_ ->
|
|
State
|
|
end
|
|
end;
|
|
_ ->
|
|
NewState =
|
|
try Mod:work(Task, State) of
|
|
TemState ->
|
|
TemState
|
|
catch
|
|
C:R:S ->
|
|
?FwErr("woker do task error ~p ~p ~p ~p ~p ~n", [FName, Mod, IsTmp, self(), {C, R, S}]),
|
|
State
|
|
end,
|
|
tryWorkLoop(WParam, NewState)
|
|
end.
|