瀏覽代碼

优化调整

master
AICells 4 年之前
父節點
當前提交
7c343150f1
共有 2 個文件被更改,包括 61 次插入35 次删除
  1. +51
    -25
      src/gen_ipc.erl
  2. +10
    -10
      src/gen_srv.erl

+ 51
- 25
src/gen_ipc.erl 查看文件

@ -1045,7 +1045,7 @@ report_error(#epmHer{epmId = EpmId, epmM = EpmM}, Reason, State, LastIn) ->
handler => {EpmId, EpmM},
name => undefined,
last_message => LastIn,
state=> format_status(terminate, [EpmM, get(), State]),
state=> State,
reason => Reason
},
#{
@ -1757,20 +1757,40 @@ doParseAL([OneAction | LeftActions], CallbackForm, Name, IsEnter, Timers, Debug,
%% 进行状态转换
performTransitions(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewStatus, Debug, [CurEvent | LeftEvents], NextEs, IsPos, IsHib, DoAfter) ->
%% 已收集所有选项,并缓冲next_events。执行实际状态转换。如果推迟则将当前事件移至推迟
%% 此时 Timeouts, NextEs的顺序与最开始出现的顺序相反. 后面执行的顺序 超时添加和更新 + 零超时 + 当前事件 + 反序的Postpone事件 + LeftEvent
NewDebug = ?SYS_DEBUG(Debug, Name, case IsPos of true -> {postpone, CurEvent, CurStatus, NewStatus}; _ ->
{consume, CurEvent, NewStatus, NewStatus} end),
%% 此时 NextEs的顺序与最开始出现的顺序相反. 后面执行的顺序 当前新增事件 + 反序的Postpone事件 + LeftEvents
NewDebug = ?SYS_DEBUG(Debug, Name, case IsPos of true -> {postpone, CurEvent, CurStatus, NewStatus}; _ -> {consume, CurEvent, CurStatus, NewStatus} end),
if
CurStatus =:= NewStatus ->
%% Cancel event timeout
if
IsPos ->
performTimeouts(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, [CurEvent | Postponed], Timers, NewStatus, CurState, NewDebug, LeftEvents, NextEs, IsHib, DoAfter);
LastLeftEvents =
case NextEs of
[] ->
LeftEvents;
[Es1] ->
[Es1 | LeftEvents];
[Es2, Es1] ->
[Es1, Es2 | LeftEvents];
_ ->
lists:reverse(NextEs, LeftEvents)
end,
performEvents(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, [CurEvent | Postponed], Timers, NewStatus, CurState, NewDebug, LastLeftEvents, IsHib, DoAfter);
true ->
performTimeouts(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, NewStatus, CurState, NewDebug, LeftEvents, NextEs, IsHib, DoAfter)
LastLeftEvents =
case NextEs of
[] ->
LeftEvents;
[Es1] ->
[Es1 | LeftEvents];
[Es2, Es1] ->
[Es1, Es2 | LeftEvents];
_ ->
lists:reverse(NextEs, LeftEvents)
end,
performEvents(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, NewStatus, CurState, NewDebug, LastLeftEvents, IsHib, DoAfter)
end;
true ->
%% 取消 status and event timeout
%% 状态发生改变 重试推迟的事件
if
IsPos ->
@ -1785,7 +1805,18 @@ performTransitions(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers
_ ->
lists:reverse(Postponed, [CurEvent | LeftEvents])
end,
performTimeouts(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, [], Timers, NewStatus, CurState, NewDebug, NewLeftEvents, NextEs, IsHib, DoAfter);
LastLeftEvents =
case NextEs of
[] ->
NewLeftEvents;
[Es1] ->
[Es1 | NewLeftEvents];
[Es2, Es1] ->
[Es1, Es2 | NewLeftEvents];
_ ->
lists:reverse(NextEs, NewLeftEvents)
end,
performEvents(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, [], Timers, NewStatus, CurState, NewDebug, LastLeftEvents, IsHib, DoAfter);
true ->
NewLeftEvents =
case Postponed of
@ -1798,26 +1829,21 @@ performTransitions(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers
_ ->
lists:reverse(Postponed, LeftEvents)
end,
performTimeouts(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, [], Timers, NewStatus, CurState, NewDebug, NewLeftEvents, NextEs, IsHib, DoAfter)
LastLeftEvents =
case NextEs of
[] ->
NewLeftEvents;
[Es1] ->
[Es1 | NewLeftEvents];
[Es2, Es1] ->
[Es1, Es2 | NewLeftEvents];
_ ->
lists:reverse(NextEs, NewLeftEvents)
end,
performEvents(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, [], Timers, NewStatus, CurState, NewDebug, LastLeftEvents, IsHib, DoAfter)
end
end.
%% 通过超时和插入事件的处理继续状态转换
performTimeouts(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, NextEs, IsHib, DoAfter) ->
TemLastEvents =
case NextEs of
[] ->
LeftEvents;
[E1] ->
[E1 | LeftEvents];
[E2, E1] ->
[E1, E2 | LeftEvents];
_ ->
lists:reverse(NextEs, LeftEvents)
end,
performEvents(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, TemLastEvents, IsHib, DoAfter).
%% 状态转换已完成,如果有排队事件,则继续循环,否则获取新事件
performEvents(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, IsHib, DoAfter) ->
% io:format("loop_done: status_data = ~p ~n postponed = ~p LeftEvents = ~p ~n timers = ~p.~n", [S#status.status_data,,S#status.postponed,LeftEvents,S#status.timers]),

+ 10
- 10
src/gen_srv.erl 查看文件

@ -290,7 +290,7 @@ loopEntry(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState,
%%-----------------------------------------------------------------
%% Callback functions for system messages handling.
%%-----------------------------------------------------------------
system_continue(Parent, Debug, [Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib]) ->
system_continue(Parent, Debug, {Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib}) ->
case IsHib of
true ->
proc_lib:hibernate(?MODULE, wakeupFromHib, [Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, IsHib]);
@ -299,10 +299,10 @@ system_continue(Parent, Debug, [Name, Module, HibernateAfterTimeout, Timers, Cur
end.
-spec system_terminate(_, _, _, [_]) -> no_return().
system_terminate(Reason, _Parent, Debug, [Name, Module, _HibernateAfterTimeout, Timers, CurState, _IsHib]) ->
system_terminate(Reason, _Parent, Debug, {Name, Module, _HibernateAfterTimeout, Timers, CurState, _IsHib}) ->
terminate(exit, Reason, ?STACKTRACE(), Name, Module, Debug, Timers, CurState, []).
system_code_change([Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib], _Module, OldVsn, Extra) ->
system_code_change({Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib}, _Module, OldVsn, Extra) ->
case
try Module:code_change(OldVsn, CurState, Extra)
catch
@ -310,16 +310,16 @@ system_code_change([Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib
_C:_R -> {_R, _R}
end
of
{ok, NewState} -> {ok, [Name, Module, HibernateAfterTimeout, Timers, NewState, IsHib]};
{ok, NewState} -> {ok, {Name, Module, HibernateAfterTimeout, Timers, NewState, IsHib}};
Error -> Error
end.
system_get_state([_Name, _Module, _HibernateAfterTimeout, _Timers, CurState, _IsHib]) ->
system_get_state({_Name, _Module, _HibernateAfterTimeout, _Timers, CurState, _IsHib}) ->
{ok, CurState}.
system_replace_state(StateFun, [Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib]) ->
system_replace_state(StateFun, {Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib}) ->
NewState = StateFun(CurState),
{ok, NewState, [Name, Module, HibernateAfterTimeout, Timers, NewState, IsHib]}.
{ok, NewState, {Name, Module, HibernateAfterTimeout, Timers, NewState, IsHib}}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sys callbacks end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% API helpers start %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -676,7 +676,7 @@ receiveIng(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState,
end;
{system, PidFrom, Request} ->
%% system_continue/3
sys:handle_system_msg(Request, PidFrom, Parent, ?MODULE, Debug, [Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib], IsHib);
sys:handle_system_msg(Request, PidFrom, Parent, ?MODULE, Debug, {Name, Module, HibernateAfterTimeout, Timers, CurState, IsHib}, IsHib);
{'EXIT', Parent, Reason} ->
terminate(Reason, Reason, ?STACKTRACE(), Name, Module, Debug, Timers, CurState, Msg);
@ -1221,11 +1221,11 @@ mod(_) -> "t".
%% Status information
%%-----------------------------------------------------------------
format_status(Opt, StatusData) ->
[PDict, SysState, Parent, Debug, [Name, State, Module, _Time, _HibernateAfterTimeout]] = StatusData,
[PDict, SysState, Parent, Debug, {Name, Module, _HibernateAfterTimeout, _Timers, CurState, _IsHib}] = StatusData,
Header = gen:format_status_header("Status for generic server", Name),
Log = sys:get_log(Debug),
Specific =
case format_status(Opt, Module, PDict, State) of
case format_status(Opt, Module, PDict, CurState) of
S when is_list(S) -> S;
S -> [S]
end,

Loading…
取消
儲存