|
|
@ -13,7 +13,7 @@ |
|
|
|
, cast/2, send/2 |
|
|
|
, abcast/2, abcast/3 |
|
|
|
, call/2, call/3 |
|
|
|
, send_request/2, wait_response/1, wait_response/2, check_response/2 |
|
|
|
, send_request/2, wait_response/1, wait_response/2, receive_response/1, receive_response/2, check_response/2 |
|
|
|
, multi_call/2, multi_call/3, multi_call/4 |
|
|
|
, enter_loop/4, enter_loop/5, enter_loop/6 |
|
|
|
, reply/1, reply/2 |
|
|
@ -176,9 +176,9 @@ |
|
|
|
{'reply', Reply :: term(), NewState :: term()} | % 用作gen_server模式时快速响应进入消息接收 |
|
|
|
{'sreply', Reply :: term(), NextStatus :: term(), NewState :: term()} | % 用作gen_ipc模式便捷式返回reply 而不用把reply放在actions列表中 |
|
|
|
{'noreply', NewState :: term()} | % 用作gen_server模式时快速响应进入消息接收 |
|
|
|
{'reply', Reply :: term(), NewState :: term(), Options :: hibernate | {doAfter, Args}} | % 用作gen_server模式时快速响应进入消息接收 |
|
|
|
{'reply', Reply :: term(), NewState :: term(), Options :: hibernate | {doAfter, Args :: term()}} | % 用作gen_server模式时快速响应进入消息接收 |
|
|
|
{'sreply', Reply :: term(), NextStatus :: term(), NewState :: term(), Actions :: actions(eventAction())} | % 用作gen_ipc模式便捷式返回reply 而不用把reply放在actions列表中 |
|
|
|
{'noreply', NewState :: term(), Options :: hibernate | {doAfter, Args}} | % 用作gen_server模式时快速响应进入循环 |
|
|
|
{'noreply', NewState :: term(), Options :: hibernate | {doAfter, Args :: term()}} | % 用作gen_server模式时快速响应进入循环 |
|
|
|
{'nextS', NextStatus :: term(), NewState :: term()} | % {next_status,NextS,NewData,[]} |
|
|
|
{'nextS', NextStatus :: term(), NewState :: term(), Actions :: actions(eventAction())} | % Status transition, maybe to the same status |
|
|
|
commonCallbackResult(eventAction()). |
|
|
@ -365,7 +365,7 @@ doModuleInit(Module, Args) -> |
|
|
|
Module:init(Args) |
|
|
|
catch |
|
|
|
throw:Ret -> Ret; |
|
|
|
Class:Reason -> {'EXIT', Class, Reason, ?STACKTRACE()} |
|
|
|
Class:Reason:Stacktrace -> {'EXIT', Class, Reason, Stacktrace} |
|
|
|
end. |
|
|
|
|
|
|
|
init_it(Starter, self, ServerRef, Module, Args, Opts) -> |
|
|
@ -685,6 +685,14 @@ wait_response(RequestId) -> |
|
|
|
wait_response(RequestId, Timeout) -> |
|
|
|
gen:wait_response(RequestId, Timeout). |
|
|
|
|
|
|
|
-spec receive_response(RequestId::serverRef()) -> {reply, Reply::term()} | {error, {term(), serverRef()}}. |
|
|
|
receive_response(RequestId) -> |
|
|
|
gen:receive_response(RequestId, infinity). |
|
|
|
|
|
|
|
-spec receive_response(RequestId::requestId(), timeout()) -> {reply, Reply::term()} | 'timeout' | {error, {term(), serverRef()}}. |
|
|
|
receive_response(RequestId, Timeout) -> |
|
|
|
gen:receive_response(RequestId, Timeout). |
|
|
|
|
|
|
|
-spec check_response(Msg :: term(), RequestId :: requestId()) -> |
|
|
|
{reply, Reply :: term()} | 'no_reply' | {error, {term(), serverRef()}}. |
|
|
|
check_response(Msg, RequestId) -> |
|
|
@ -732,7 +740,7 @@ rec_nodes(Tag, [N | Tail], Name, BadNodes, Replies, Time, TimerId) -> |
|
|
|
monitor_node(N, false), |
|
|
|
rec_nodes_rest(Tag, Tail, Name, [N | BadNodes], Replies) |
|
|
|
after Time -> |
|
|
|
case rpc:call(N, erlang, whereis, [Name]) of |
|
|
|
case erpc:call(N, erlang, whereis, [Name]) of |
|
|
|
Pid when is_pid(Pid) -> |
|
|
|
rec_nodes(Tag, [N | Tail], Name, BadNodes, |
|
|
|
Replies, infinity, TimerId); |
|
|
@ -820,6 +828,9 @@ reply(Replies) when is_list(Replies) -> |
|
|
|
ok. |
|
|
|
|
|
|
|
-spec reply(From :: from(), Reply :: term()) -> ok. |
|
|
|
reply({_To, [alias|Alias] = Tag}, Reply) -> |
|
|
|
Alias ! {Tag, Reply}, |
|
|
|
ok; |
|
|
|
reply({To, Tag}, Reply) -> |
|
|
|
try To ! {Tag, Reply}, |
|
|
|
ok |
|
|
@ -827,6 +838,15 @@ reply({To, Tag}, Reply) -> |
|
|
|
ok |
|
|
|
end. |
|
|
|
|
|
|
|
try_reply(false, _Msg) -> |
|
|
|
ignore; |
|
|
|
try_reply({To, Ref}, Msg) -> |
|
|
|
try To ! {Ref, Msg}, |
|
|
|
ok |
|
|
|
catch _:_ -> |
|
|
|
ok |
|
|
|
end. |
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% API helpers end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% gen_event start %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
epmRequest({global, Name}, Msg) -> |
|
|
@ -885,11 +905,11 @@ add_epm(EpmSrv, EpmHandler, Args) -> |
|
|
|
|
|
|
|
-spec add_sup_epm(serverRef(), epmHandler(), term()) -> term(). |
|
|
|
add_sup_epm(EpmSrv, EpmHandler, Args) -> |
|
|
|
epmRpc(EpmSrv, {'$addSupEpm', EpmHandler, Args}). |
|
|
|
epmRpc(EpmSrv, {'$addSupEpm', EpmHandler, Args, self()}). |
|
|
|
|
|
|
|
-spec del_epm(serverRef(), epmHandler(), term()) -> term(). |
|
|
|
del_epm(EpmSrv, EpmHandler, Args) -> |
|
|
|
epmRpc(EpmSrv, {'$deleteEpm', EpmHandler, Args}). |
|
|
|
epmRpc(EpmSrv, {'$delEpm', EpmHandler, Args}). |
|
|
|
|
|
|
|
-spec swap_epm(serverRef(), {epmHandler(), term()}, {epmHandler(), term()}) -> 'ok' | {'error', term()}. |
|
|
|
swap_epm(EpmSrv, {H1, A1}, {H2, A2}) -> |
|
|
@ -928,8 +948,8 @@ doAddEpm(EpmHers, {Module, _SubId} = EpmId, Args, EpmSup) -> |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
addNewEpm(Ret, EpmHers, Module, EpmId, EpmSup); |
|
|
|
C:R -> |
|
|
|
{{error, {C, R, ?STACKTRACE()}}, EpmHers, false} |
|
|
|
C:R:S -> |
|
|
|
{{error, {C, R, S}}, EpmHers, false} |
|
|
|
end |
|
|
|
end; |
|
|
|
doAddEpm(EpmHers, Module, Args, EpmSup) -> |
|
|
@ -943,8 +963,8 @@ doAddEpm(EpmHers, Module, Args, EpmSup) -> |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
addNewEpm(Ret, EpmHers, Module, Module, EpmSup); |
|
|
|
C:R -> |
|
|
|
{{error, {C, R, ?STACKTRACE()}}, EpmHers, false} |
|
|
|
C:R:S -> |
|
|
|
{{error, {C, R, S}}, EpmHers, false} |
|
|
|
end |
|
|
|
end. |
|
|
|
|
|
|
@ -973,7 +993,7 @@ doSwapEpm(EpmHers, EpmId1, Args1, EpmMId, Args2) -> |
|
|
|
end. |
|
|
|
|
|
|
|
doSwapSupEpm(EpmHers, EpmId1, Args1, EpmMId, Args2, EpmSup) -> |
|
|
|
case EpmHers(EpmId1) of |
|
|
|
case EpmHers of |
|
|
|
#{EpmId1 := EpmHer} -> |
|
|
|
State2 = epmTerminate(EpmHer, Args1, swapped, {swapped, EpmMId, EpmSup}), |
|
|
|
NewEpmHers = maps:remove(EpmId1, EpmHers), |
|
|
@ -982,13 +1002,17 @@ doSwapSupEpm(EpmHers, EpmId1, Args1, EpmMId, Args2, EpmSup) -> |
|
|
|
doAddSupEpm(EpmHers, EpmMId, {Args2, undefined}, EpmSup) |
|
|
|
end. |
|
|
|
|
|
|
|
doNotify(EpmHers, Event, Func, _Form) -> |
|
|
|
FunFor = |
|
|
|
fun(K, _V, {TemEpmHers, IsHib}) -> |
|
|
|
{NewEpmHers, NewIsHib} = doEpmHandle(TemEpmHers, K, Func, Event, false), |
|
|
|
{NewEpmHers, NewIsHib orelse IsHib} |
|
|
|
end, |
|
|
|
maps:fold(FunFor, {EpmHers, false}, EpmHers). |
|
|
|
doNotify(EpmHers, Func, Event, _Form) -> |
|
|
|
allNotify(maps:iterator(EpmHers), Func, Event, false, EpmHers, false). |
|
|
|
|
|
|
|
allNotify(Iterator, Func, Event, From, TemEpmHers, IsHib) -> |
|
|
|
case maps:next(Iterator) of |
|
|
|
{K, _V, NextIterator} -> |
|
|
|
{NewEpmHers, NewIsHib} = doEpmHandle(TemEpmHers, K, Func, Event, From), |
|
|
|
allNotify(NextIterator, Func, Event, From, NewEpmHers, IsHib orelse NewIsHib); |
|
|
|
_ -> |
|
|
|
{TemEpmHers, IsHib} |
|
|
|
end. |
|
|
|
|
|
|
|
doEpmHandle(EpmHers, EpmHandler, Func, Event, From) -> |
|
|
|
case EpmHers of |
|
|
@ -999,16 +1023,17 @@ doEpmHandle(EpmHers, EpmHandler, Func, Event, From) -> |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
handleEpmCR(Ret, EpmHers, EpmHer, Event, From); |
|
|
|
C:R -> |
|
|
|
epmTerminate(EpmHer, {error, {C, R, ?STACKTRACE()}}, Event, crash), |
|
|
|
NewEpmHers = maps:remove(EpmHandler, EpmHer), |
|
|
|
C:R:S -> |
|
|
|
epmTerminate(EpmHer, {error, {C, R, S}}, Event, crash), |
|
|
|
NewEpmHers = maps:remove(EpmHandler, EpmHers), |
|
|
|
{NewEpmHers, false} |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
try_reply(From, {error, bad_module}), |
|
|
|
{EpmHers, false} |
|
|
|
end. |
|
|
|
|
|
|
|
doDeleteEpm(EpmHers, EpmHandler, Args) -> |
|
|
|
doDelEpm(EpmHers, EpmHandler, Args) -> |
|
|
|
case EpmHers of |
|
|
|
#{EpmHandler := EpmHer} -> |
|
|
|
epmTerminate(EpmHer, Args, delete, normal), |
|
|
@ -1054,7 +1079,7 @@ report_error(#epmHer{epmId = EpmId, epmM = EpmM}, Reason, State, LastIn) -> |
|
|
|
handler => {EpmId, EpmM}, |
|
|
|
name => undefined, |
|
|
|
last_message => LastIn, |
|
|
|
state=> State, |
|
|
|
state => State, |
|
|
|
reason => Reason |
|
|
|
}, |
|
|
|
#{ |
|
|
@ -1093,30 +1118,39 @@ epm_log(#{label := {es_gen_ipc, no_handle_info}, module := Module, message := Ms |
|
|
|
"** Unhandled message: ~tp~n", [Module, Msg]}. |
|
|
|
|
|
|
|
epmStopAll(EpmHers) -> |
|
|
|
FunFor = |
|
|
|
fun(_K, V, _Ok) -> |
|
|
|
allStop(maps:iterator(EpmHers)). |
|
|
|
|
|
|
|
allStop(Iterator) -> |
|
|
|
case maps:next(Iterator) of |
|
|
|
{_K, V, NextIterator} -> |
|
|
|
epmTerminate(V, stop, 'receive', shutdown), |
|
|
|
case element(#epmHer.epmSup, V) of |
|
|
|
undefined -> |
|
|
|
ignore; |
|
|
|
EpmSup -> |
|
|
|
unlink(EpmSup) |
|
|
|
end |
|
|
|
end, |
|
|
|
maps:fold(FunFor, ok, EpmHers). |
|
|
|
end, |
|
|
|
allStop(NextIterator); |
|
|
|
none -> |
|
|
|
ok |
|
|
|
end. |
|
|
|
|
|
|
|
epmStopOne(ExitEmpSup, EpmHers) -> |
|
|
|
FunFor = |
|
|
|
fun(K, V, TemEpmHers) -> |
|
|
|
forStopOne(maps:iterator(EpmHers), ExitEmpSup, EpmHers). |
|
|
|
|
|
|
|
forStopOne(Iterator, ExitEmpSup, TemEpmHers) -> |
|
|
|
case maps:next(Iterator) of |
|
|
|
{K, V, NextIterator} -> |
|
|
|
case element(#epmHer.epmSup, V) =:= ExitEmpSup of |
|
|
|
true -> |
|
|
|
epmTerminate(V, stop, 'receive', shutdown), |
|
|
|
maps:remove(K, TemEpmHers); |
|
|
|
forStopOne(NextIterator, ExitEmpSup, maps:remove(K, TemEpmHers)); |
|
|
|
_ -> |
|
|
|
EpmHers |
|
|
|
end |
|
|
|
end, |
|
|
|
maps:fold(FunFor, EpmHers, EpmHers). |
|
|
|
forStopOne(NextIterator, ExitEmpSup, TemEpmHers) |
|
|
|
end; |
|
|
|
none -> |
|
|
|
TemEpmHers |
|
|
|
end. |
|
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% gen_event end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
listify(Item) when is_list(Item) -> |
|
|
@ -1188,8 +1222,8 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post |
|
|
|
catch |
|
|
|
throw:Result -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, From); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
end. |
|
|
|
|
|
|
|
matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, Cast) -> |
|
|
@ -1201,8 +1235,8 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post |
|
|
|
catch |
|
|
|
throw:Result -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
end. |
|
|
|
|
|
|
|
matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, Msg) -> |
|
|
@ -1214,8 +1248,8 @@ matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post |
|
|
|
catch |
|
|
|
throw:Result -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
end. |
|
|
|
|
|
|
|
matchTimeoutMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, TimeoutType, TimeoutMsg) -> |
|
|
@ -1227,8 +1261,8 @@ matchTimeoutMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, P |
|
|
|
catch |
|
|
|
throw:Result -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) |
|
|
|
end. |
|
|
|
|
|
|
|
matchEpmCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, From, Request) -> |
|
|
@ -1244,8 +1278,8 @@ matchEpmCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, P |
|
|
|
{Reply, NewEpmHers, IsHib} = doAddSupEpm(EpmHers, EpmHandler, Args, EpmSup), |
|
|
|
reply(From, Reply), |
|
|
|
reLoopEntry(Parent, Name, Module, HibernateAfterTimeout, IsEnter, NewEpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, IsHib); |
|
|
|
{'$deleteEpm', EpmHandler, Args} -> |
|
|
|
{Reply, NewEpmHers} = doDeleteEpm(EpmHers, EpmHandler, Args), |
|
|
|
{'$delEpm', EpmHandler, Args} -> |
|
|
|
{Reply, NewEpmHers} = doDelEpm(EpmHers, EpmHandler, Args), |
|
|
|
reply(From, Reply), |
|
|
|
receiveIng(Parent, Name, Module, HibernateAfterTimeout, IsEnter, NewEpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, false); |
|
|
|
{'$swapEpm', EpmId1, Args1, EpmId2, Args2} -> |
|
|
@ -1257,7 +1291,7 @@ matchEpmCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, P |
|
|
|
reply(From, Reply), |
|
|
|
reLoopEntry(Parent, Name, Module, HibernateAfterTimeout, IsEnter, NewEpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, IsHib); |
|
|
|
{'$syncNotify', Event} -> |
|
|
|
{NewEpmHers, IsHib} = doNotify(EpmHers,
Event, handleEvent, false), |
|
|
|
{NewEpmHers, IsHib} = doNotify(EpmHers, handleEvent,
Event, false), |
|
|
|
reply(From, ok), |
|
|
|
startEpmCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, NewEpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, handleEpmEvent, Request, IsHib); |
|
|
|
{'$epmCall', EpmHandler, Query} -> |
|
|
@ -1269,10 +1303,10 @@ matchEpmInfoMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, P |
|
|
|
NewDebug = ?SYS_DEBUG(Debug, Name, {in, {CmdOrEmpHandler, Event}, CurStatus}), |
|
|
|
case CmdOrEmpHandler of |
|
|
|
'$infoNotify' -> |
|
|
|
{NewEpmHers, IsHib} = doNotify(EpmHers,
Event, handleEvent, false), |
|
|
|
{NewEpmHers, IsHib} = doNotify(EpmHers, handleEvent,
Event, false), |
|
|
|
startEpmCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, NewEpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, handleEpmEvent, Event, IsHib); |
|
|
|
EpmHandler -> |
|
|
|
{NewEpmHers, IsHib} = doEpmHandle(EpmHers, EpmHandler, Event, handleInfo, false), |
|
|
|
{NewEpmHers, IsHib} = doEpmHandle(EpmHers, EpmHandler, handleInfo, Event, false), |
|
|
|
startEpmCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, NewEpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, handleEpmInfo, Event, IsHib) |
|
|
|
end. |
|
|
|
|
|
|
@ -1286,8 +1320,8 @@ startEpmCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event], Ret, ?CB_FORM_EVENT, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event]) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event]) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
receiveIng(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, IsHib) |
|
|
@ -1300,8 +1334,8 @@ startEnterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po |
|
|
|
catch |
|
|
|
throw:Result -> |
|
|
|
handleEnterCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, PrevStatus, CurState, CurStatus, Debug, LeftEvents, NextEs, IsPos, IsHib, DoAfter, Result); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
end. |
|
|
|
|
|
|
|
startAfterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Args) -> |
|
|
@ -1311,8 +1345,8 @@ startAfterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po |
|
|
|
catch |
|
|
|
throw:Result -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Result, ?CB_FORM_AFTER, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
end. |
|
|
|
|
|
|
|
startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, {Type, Content}) -> |
|
|
@ -1324,8 +1358,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
end; |
|
|
|
'info' -> |
|
|
|
try Module:handleInfo(Content, CurStatus, CurState) of |
|
|
@ -1334,8 +1368,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
end; |
|
|
|
{'call', From} -> |
|
|
|
try Module:handleCall(Content, CurStatus, CurState, From) of |
|
|
@ -1344,8 +1378,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, From); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
try Module:handleOnevent(Type, Content, CurStatus, CurState) of |
|
|
@ -1354,15 +1388,15 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po |
|
|
|
catch |
|
|
|
throw:Ret -> |
|
|
|
handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false); |
|
|
|
Class:Reason -> |
|
|
|
terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
Class:Reason:Strace -> |
|
|
|
terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) |
|
|
|
end |
|
|
|
end. |
|
|
|
|
|
|
|
%% handleEpmCallbackRet |
|
|
|
handleEpmCR(Result, EpmHers, #epmHer{epmId = EpmId} = EpmHer, Event, From) -> |
|
|
|
case Result of |
|
|
|
ok -> |
|
|
|
kpS -> |
|
|
|
{EpmHers, false}; |
|
|
|
{ok, NewEpmS} -> |
|
|
|
MewEpmHer = setelement(#epmHer.epmS, EpmHer, NewEpmS), |
|
|
@ -1996,13 +2030,16 @@ cancelTimer(TimeoutType, TimerRef, Timers) -> |
|
|
|
|
|
|
|
%% Return a list of all pending timeouts |
|
|
|
listTimeouts(Timers) -> |
|
|
|
{ |
|
|
|
maps:size(Timers), |
|
|
|
maps:fold( |
|
|
|
fun(TimeoutType, {_TimerRef, TimeoutMsg}, Acc) -> |
|
|
|
[{TimeoutType, TimeoutMsg} | Acc] |
|
|
|
end, [], Timers) |
|
|
|
}. |
|
|
|
{maps:size(Timers), allTimer(maps:iterator(Timers), [])}. |
|
|
|
|
|
|
|
allTimer(Iterator, Acc) -> |
|
|
|
case maps:next(Iterator) of |
|
|
|
{TimeoutType, {_TimerRef, TimeoutMsg}, NextIterator} -> |
|
|
|
allTimer(NextIterator, [{TimeoutType, TimeoutMsg} | Acc]); |
|
|
|
none -> |
|
|
|
Acc |
|
|
|
end. |
|
|
|
|
|
|
|
%%--------------------------------------------------------------------------- |
|
|
|
|
|
|
|
terminate(Class, Reason, Stacktrace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) -> |
|
|
@ -2099,15 +2136,17 @@ format_log(Report) -> |
|
|
|
limit_report(Report, unlimited) -> |
|
|
|
Report; |
|
|
|
limit_report( |
|
|
|
#{label:={es_gen_ipc, terminate}, |
|
|
|
queue:=Q, |
|
|
|
postponed:=Postponed, |
|
|
|
module:=Module, |
|
|
|
status:=FmtData, |
|
|
|
timeouts:=Timeouts, |
|
|
|
log:=Log, |
|
|
|
reason:={Class, Reason, Stacktrace}, |
|
|
|
client_info:=ClientInfo} = Report, |
|
|
|
#{ |
|
|
|
label := {es_gen_ipc, terminate}, |
|
|
|
queue := Q, |
|
|
|
postponed := Postponed, |
|
|
|
module := Module, |
|
|
|
status := FmtData, |
|
|
|
timeouts := Timeouts, |
|
|
|
log := Log, |
|
|
|
reason := {Class, Reason, Stacktrace}, |
|
|
|
client_info := ClientInfo |
|
|
|
} = Report, |
|
|
|
Depth) -> |
|
|
|
Report#{ |
|
|
|
queue => |
|
|
@ -2156,25 +2195,26 @@ format_log(Report, FormatOpts0) -> |
|
|
|
FormatOpts = maps:merge(Default, FormatOpts0), |
|
|
|
IoOpts = |
|
|
|
case FormatOpts of |
|
|
|
#{
chars_limit:=unlimited} -> []; |
|
|
|
#{
chars_limit:=Limit} -> [{chars_limit, Limit}] |
|
|
|
#{chars_limit := unlimited} -> []; |
|
|
|
#{chars_limit := Limit} -> [{chars_limit, Limit}] |
|
|
|
end, |
|
|
|
{Format, Args} = format_log_single(Report, FormatOpts), |
|
|
|
io_lib:format(Format, Args, IoOpts). |
|
|
|
|
|
|
|
format_log_single( |
|
|
|
#{ |
|
|
|
label:={es_gen_ipc, terminate}, |
|
|
|
name:=Name, |
|
|
|
queue:=Q, |
|
|
|
label := {es_gen_ipc, terminate}, |
|
|
|
name := Name, |
|
|
|
queue := Q, |
|
|
|
%% postponed |
|
|
|
%% isEnter |
|
|
|
status:=FmtData, |
|
|
|
status := FmtData, |
|
|
|
%% timeouts |
|
|
|
log:=Log, |
|
|
|
reason:={Class, Reason, Stacktrace}, |
|
|
|
client_info:=ClientInfo}, |
|
|
|
#{single_line:=true, depth:=Depth} = FormatOpts) -> |
|
|
|
log := Log, |
|
|
|
reason := {Class, Reason, Stacktrace}, |
|
|
|
client_info := ClientInfo |
|
|
|
}, |
|
|
|
#{single_line := true, depth := Depth} = FormatOpts) -> |
|
|
|
P = p(FormatOpts), |
|
|
|
{FixedReason, FixedStacktrace} = fix_reason(Class, Reason, Stacktrace), |
|
|
|
{ClientFmt, ClientArgs} = format_client_log_single(ClientInfo, P, Depth), |
|
|
@ -2224,18 +2264,19 @@ format_log_single(Report, FormatOpts) -> |
|
|
|
|
|
|
|
format_log_multi( |
|
|
|
#{ |
|
|
|
label:={es_gen_ipc, terminate}, |
|
|
|
name:=Name, |
|
|
|
queue:=Q, |
|
|
|
postponed:=Postponed, |
|
|
|
module:=Module, |
|
|
|
isEnter:=StateEnter, |
|
|
|
status:=FmtData, |
|
|
|
timeouts:=Timeouts, |
|
|
|
log:=Log, |
|
|
|
reason:={Class, Reason, Stacktrace}, |
|
|
|
client_info:=ClientInfo}, |
|
|
|
#{depth:=Depth} = FormatOpts) -> |
|
|
|
label := {es_gen_ipc, terminate}, |
|
|
|
name := Name, |
|
|
|
queue := Q, |
|
|
|
postponed := Postponed, |
|
|
|
module := Module, |
|
|
|
isEnter := StateEnter, |
|
|
|
status := FmtData, |
|
|
|
timeouts := Timeouts, |
|
|
|
log := Log, |
|
|
|
reason := {Class, Reason, Stacktrace}, |
|
|
|
client_info := ClientInfo |
|
|
|
}, |
|
|
|
#{depth := Depth} = FormatOpts) -> |
|
|
|
P = p(FormatOpts), |
|
|
|
{FixedReason, FixedStacktrace} = fix_reason(Class, Reason, Stacktrace), |
|
|
|
{ClientFmt, ClientArgs} = format_client_log(ClientInfo, P, Depth), |
|
|
@ -2378,7 +2419,7 @@ format_client_log({_Pid, {Name, Stacktrace}}, P, Depth) -> |
|
|
|
end, |
|
|
|
{Format, Args}. |
|
|
|
|
|
|
|
p(#{
single_line:=Single,
depth:=Depth,
encoding:=Enc}) -> |
|
|
|
p(#{single_line := Single, depth := Depth, encoding := Enc}) -> |
|
|
|
"~" ++ single(Single) ++ mod(Enc) ++ p(Depth); |
|
|
|
p(unlimited) -> |
|
|
|
"p"; |