You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 line
2.5 KiB

  1. -module(fwUtil).
  2. -include("eFaw.hrl").
  3. -export([
  4. initCfg/1
  5. , initWParam/2
  6. , tryWorkOnce/2
  7. , tryWorkLoop/2
  8. ]).
  9. initCfg(Kvs) ->
  10. [
  11. begin
  12. case lists:keyfind(Key, 1, Kvs) of
  13. false ->
  14. {Key, DefV};
  15. Tuple ->
  16. Tuple
  17. end
  18. end
  19. || {Key, DefV} <- ?FawDefV
  20. ].
  21. initWParam(FName, IsTmp) ->
  22. #wParam{fName = FName, fNameTid = persistent_term:get(FName), mod = FName:getV(?wMod), isTmp = IsTmp}.
  23. tryWorkOnce(#wParam{fName = FName, fNameTid = FNameTid, mod = Mod, isTmp = IsTmp}, State) ->
  24. Task = eLfq:tryOut(FNameTid),
  25. case Task of
  26. lfq_empty ->
  27. case IsTmp of
  28. false ->
  29. fwFMgr:wSleep(FName, self()),
  30. case erlang:function_exported(Mod, idle, 1) of
  31. true ->
  32. Mod:idle(State);
  33. _ ->
  34. State
  35. end;
  36. _ ->
  37. fwFMgr:tWOver(FName, self()),
  38. case erlang:function_exported(Mod, close, 1) of
  39. true ->
  40. Mod:close(State);
  41. _ ->
  42. State
  43. end
  44. end;
  45. _ ->
  46. try Mod:work(Task, State) of
  47. NewState ->
  48. NewState
  49. catch
  50. C:R:S ->
  51. ?FwErr("woker do task error ~p ~p ~p ~p ~p ~n", [FName, Mod, IsTmp, self(), {C, R, S}]),
  52. State
  53. end
  54. end.
  55. tryWorkLoop(#wParam{fName = FName, fNameTid = FNameTid, mod = Mod, isTmp = IsTmp} = WParam, State) ->
  56. Task = eLfq:tryOut(FNameTid),
  57. case Task of
  58. lfq_empty ->
  59. case IsTmp of
  60. false ->
  61. fwFMgr:wSleep(FName, self()),
  62. case erlang:function_exported(Mod, idle, 1) of
  63. true ->
  64. Mod:idle(State);
  65. _ ->
  66. State
  67. end;
  68. _ ->
  69. fwFMgr:tWOver(FName, self()),
  70. case erlang:function_exported(Mod, close, 1) of
  71. true ->
  72. Mod:close(State);
  73. _ ->
  74. State
  75. end
  76. end;
  77. _ ->
  78. NewState =
  79. try Mod:work(Task, State) of
  80. TemState ->
  81. TemState
  82. catch
  83. C:R:S ->
  84. ?FwErr("woker do task error ~p ~p ~p ~p ~p ~n", [FName, Mod, IsTmp, self(), {C, R, S}]),
  85. State
  86. end,
  87. tryWorkLoop(WParam, NewState)
  88. end.