|
|
@ -220,23 +220,23 @@ init_it(Starter, Parent, ServerRef, _, _, Options) -> |
|
|
|
proc_lib:init_ack(Starter, {ok, self()}), |
|
|
|
receiveIng(Parent, Name, HibernateAfterTimeout, #{}, Debug, false). |
|
|
|
|
|
|
|
-spec add_epm(serverRef(), epmHandler(), term()) -> term(). |
|
|
|
-spec add_epm(serverRef(), epmHandler(), term()) -> ok | {error, existed} | {error, Reason}. |
|
|
|
add_epm(EpmSrv, EpmHandler, Args) -> |
|
|
|
epmRpc(EpmSrv, {'$addEpm', EpmHandler, Args}). |
|
|
|
|
|
|
|
-spec add_sup_epm(serverRef(), epmHandler(), term()) -> term(). |
|
|
|
-spec add_sup_epm(serverRef(), epmHandler(), term()) -> ok | {error, existed} | {error, Reason}. |
|
|
|
add_sup_epm(EpmSrv, EpmHandler, Args) -> |
|
|
|
epmRpc(EpmSrv, {'$addSupEpm', EpmHandler, Args, self()}). |
|
|
|
|
|
|
|
-spec del_epm(serverRef(), epmHandler(), term()) -> term(). |
|
|
|
-spec del_epm(serverRef(), epmHandler(), term()) -> ok | {error, module_not_found}. |
|
|
|
del_epm(EpmSrv, EpmHandler, Args) -> |
|
|
|
epmRpc(EpmSrv, {'$delEpm', EpmHandler, Args}). |
|
|
|
|
|
|
|
-spec swap_epm(serverRef(), {epmHandler(), term()}, {epmHandler(), term()}) -> 'ok' | {'error', term()}. |
|
|
|
-spec swap_epm(serverRef(), {epmHandler(), term()}, {epmHandler(), term()}) -> ok | {error, existed} | {error, Reason}. |
|
|
|
swap_epm(EpmSrv, {H1, A1}, {H2, A2}) -> |
|
|
|
epmRpc(EpmSrv, {'$swapEpm', H1, A1, H2, A2}). |
|
|
|
|
|
|
|
-spec swap_sup_epm(serverRef(), {epmHandler(), term()}, {epmHandler(), term()}) -> 'ok' | {'error', term()}. |
|
|
|
-spec swap_sup_epm(serverRef(), {epmHandler(), term()}, {epmHandler(), term()}) -> ok | {error, existed} | {error, Reason}. |
|
|
|
swap_sup_epm(EpmSrv, {H1, A1}, {H2, A2}) -> |
|
|
|
epmRpc(EpmSrv, {'$swapSupEpm', H1, A1, H2, A2, self()}). |
|
|
|
|
|
|
@ -368,8 +368,12 @@ epmCallMsg(Parent, ServerName, HibernateAfterTimeout, EpmHers, Debug, From, Requ |
|
|
|
reply(From, ok), |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, IsHib); |
|
|
|
{'$epmCall', EpmHandler, Query} -> |
|
|
|
{NewEpmHers, IsHib} = doEpmHandle(EpmHers, EpmHandler, handleCall, Query, From), |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, IsHib) |
|
|
|
case doEpmHandle(EpmHers, EpmHandler, handleCall, Query, From) of |
|
|
|
{NewEpmHers, IsHib} -> |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, IsHib); |
|
|
|
NewEpmHers -> |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, false) |
|
|
|
end |
|
|
|
end. |
|
|
|
|
|
|
|
epmInfoMsg(Parent, ServerName, HibernateAfterTimeout, EpmHers, Debug, CmdOrEmpHandler, Event) -> |
|
|
@ -379,8 +383,12 @@ epmInfoMsg(Parent, ServerName, HibernateAfterTimeout, EpmHers, Debug, CmdOrEmpHa |
|
|
|
{NewEpmHers, IsHib} = doNotify(EpmHers, handleEvent, Event, false), |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, IsHib); |
|
|
|
EpmHandler -> |
|
|
|
{NewEpmHers, IsHib} = doEpmHandle(EpmHers, EpmHandler, handleInfo, Event, false), |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, IsHib) |
|
|
|
case doEpmHandle(EpmHers, EpmHandler, handleInfo, Event, false) of |
|
|
|
{NewEpmHers, IsHib} -> |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, IsHib); |
|
|
|
NewEpmHers -> |
|
|
|
loopEntry(Parent, ServerName, HibernateAfterTimeout, NewEpmHers, NewDebug, false) |
|
|
|
end |
|
|
|
end. |
|
|
|
|
|
|
|
handleMsg(Parent, ServerName, HibernateAfterTimeout, EpmHers, Debug, Msg) -> |
|
|
@ -481,15 +489,18 @@ doSwapSupEpm(EpmHers, EpmId1, Args1, EpmMId, Args2, EpmSup) -> |
|
|
|
doAddSupEpm(EpmHers, EpmMId, {Args2, undefined}, EpmSup) |
|
|
|
end. |
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
case doEpmHandle(TemEpmHers, K, Func, Event, From) of |
|
|
|
{NewEpmHers, NewIsHib} -> |
|
|
|
allNotify(NextIterator, Func, Event, From, NewEpmHers, IsHib orelse NewIsHib); |
|
|
|
NewEpmHers -> |
|
|
|
allNotify(NextIterator, Func, Event, From, NewEpmHers, IsHib) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
{TemEpmHers, IsHib} |
|
|
|
end. |
|
|
@ -505,12 +516,11 @@ doEpmHandle(EpmHers, EpmId, Func, Event, From) -> |
|
|
|
handleEpmCR(Ret, EpmHers, EpmId, EpmHer, Event, From); |
|
|
|
C:R -> |
|
|
|
epmTerminate(EpmHer, {error, {C, R, ?STACKTRACE()}}, Event, crash), |
|
|
|
NewEpmHers = maps:remove(EpmId, EpmHer), |
|
|
|
{NewEpmHers, false} |
|
|
|
maps:remove(EpmId, EpmHer) |
|
|
|
end; |
|
|
|
_ -> |
|
|
|
try_reply(From, {error, bad_module}), |
|
|
|
{EpmHers, false} |
|
|
|
EpmHers |
|
|
|
end. |
|
|
|
|
|
|
|
doDelEpm(EpmHers, EpmHandler, Args) -> |
|
|
@ -526,10 +536,10 @@ doDelEpm(EpmHers, EpmHandler, Args) -> |
|
|
|
handleEpmCR(Result, EpmHers, EpmId, EpmHer, Event, From) -> |
|
|
|
case Result of |
|
|
|
kpS -> |
|
|
|
{EpmHers, false}; |
|
|
|
EpmHers; |
|
|
|
{ok, NewEpmS} -> |
|
|
|
MewEpmHer = setelement(#epmHer.epmS, EpmHer, NewEpmS), |
|
|
|
{EpmHers#{EpmId := MewEpmHer}, false}; |
|
|
|
EpmHers#{EpmId := MewEpmHer}; |
|
|
|
{ok, NewEpmS, hibernate} -> |
|
|
|
MewEpmHer = setelement(#epmHer.epmS, EpmHer, NewEpmS), |
|
|
|
{EpmHers#{EpmId := MewEpmHer}, true}; |
|
|
@ -560,25 +570,25 @@ handleEpmCR(Result, EpmHers, EpmId, EpmHer, Event, From) -> |
|
|
|
{NewEpmHers, IsHib}; |
|
|
|
removeEpm -> |
|
|
|
epmTerminate(EpmHer, removeEpm, remove, normal), |
|
|
|
{maps:remove(EpmId, EpmHers), false}; |
|
|
|
maps:remove(EpmId, EpmHers); |
|
|
|
{removeEpm, Reply} -> |
|
|
|
reply(From, Reply), |
|
|
|
epmTerminate(EpmHer, removeEpm, remove, normal), |
|
|
|
{maps:remove(EpmId, EpmHers), false}; |
|
|
|
maps:remove(EpmId, EpmHers); |
|
|
|
{reply, Reply} -> |
|
|
|
reply(From, Reply), |
|
|
|
{EpmHers, false}; |
|
|
|
EpmHers; |
|
|
|
{reply, Reply, NewEpmS} -> |
|
|
|
reply(From, Reply), |
|
|
|
MewEpmHer = setelement(#epmHer.epmS, EpmHer, NewEpmS), |
|
|
|
{EpmHers#{EpmId := MewEpmHer}, false}; |
|
|
|
EpmHers#{EpmId := MewEpmHer}; |
|
|
|
{reply, Reply, NewEpmS, hibernate} -> |
|
|
|
reply(From, Reply), |
|
|
|
MewEpmHer = setelement(#epmHer.epmS, EpmHer, NewEpmS), |
|
|
|
{EpmHers#{EpmId := MewEpmHer}, true}; |
|
|
|
Other -> |
|
|
|
epmTerminate(EpmHer, {error, Other}, Event, crash), |
|
|
|
{maps:remove(EpmId, EpmHers), false} |
|
|
|
maps:remove(EpmId, EpmHers) |
|
|
|
end. |
|
|
|
|
|
|
|
reportTerminate(EpmHer, crash, {error, Why}, LastIn, _) -> |
|
|
@ -673,7 +683,7 @@ try_reply(false, _Msg) -> |
|
|
|
ignore; |
|
|
|
try_reply({To, Ref}, Msg) -> |
|
|
|
try To ! {Ref, Msg}, |
|
|
|
ok |
|
|
|
ok |
|
|
|
catch _:_ -> |
|
|
|
ok |
|
|
|
end. |
|
|
@ -811,7 +821,7 @@ format_log_single(#{label := {gen_event, terminate}, |
|
|
|
P = p(FormatOpts), |
|
|
|
Reason1 = fix_reason(Reason), |
|
|
|
Format1 = lists:append(["Generic event handler ", P, " crashed. " |
|
|
|
"Installed: ", P, ". Last event: ", P, |
|
|
|
"Installed: ", P, ". Last event: ", P, |
|
|
|
". State: ", P, ". Reason: ", P, "."]), |
|
|
|
Args1 = |
|
|
|
case Depth of |
|
|
|