Kaynağa Gözat

rf: gen_emm修改

master
SisMaker 4 yıl önce
ebeveyn
işleme
1a20d4d96e
1 değiştirilmiş dosya ile 34 ekleme ve 24 silme
  1. +34
    -24
      src/gen_emm.erl

+ 34
- 24
src/gen_emm.erl Dosyayı Görüntüle

@ -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

Yükleniyor…
İptal
Kaydet