Kaynağa Gözat

ft: call M F A 添加

master
SisMaker 3 yıl önce
ebeveyn
işleme
86ceaab8e7
1 değiştirilmiş dosya ile 28 ekleme ve 7 silme
  1. +28
    -7
      src/gen_apu.erl

+ 28
- 7
src/gen_apu.erl Dosyayı Görüntüle

@ -384,9 +384,6 @@ clfs(ServerRef, M, F, A, Timeout) ->
erlang:raise(Class, {Reason, {?MODULE, clfs, [ServerRef, {M, F, A}]}}, ?STACKTRACE())
end.
csfs(ServerRef, M, F, A) ->
csfs(ServerRef, {'$gen_csfs', {M, F, A}}).
-spec csfn(ServerRef :: serverRef(), Msg :: term()) -> ok.
csfn({global, Name}, M, F, A) ->
try global:send(Name, {'$gen_csfn', {M, F, A}}),
@ -726,10 +723,14 @@ receiveIng(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState,
matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, From, Request);
{'$gen_cast', Cast} ->
matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Cast);
{'$gen_cast', Cast} ->
matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Cast);
{'gen_clfn', MFA} ->
matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, MFA, false);
{'gen_clfs', MFA} ->
matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, MFA, true);
{'gen_csfn', MFA} ->
matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, MFA, false);
{'gen_csfs', MFA} ->
matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, MFA, true);
{timeout, TimerRef, TimeoutName} ->
case Timers of
#{TimeoutName := {TimerRef, TimeoutMsg}} ->
@ -790,6 +791,26 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat
terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {cast, Cast})
end.
matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, MFA, IsWithState) ->
NewDebug = ?SYS_DEBUG(Debug, Name, {in, {mfa, MFA}}),
try
{M, F, A} = MFA,
case IsWithState of
true ->
erlang:apply(M, F, A ++ [CurState]);
_ ->
erlang:apply(M, F, A)
end
of
Result ->
handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false)
catch
throw:Result ->
handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false);
Class:Reason:Strace ->
terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {mfa, MFA})
end.
matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Msg) ->
NewDebug = ?SYS_DEBUG(Debug, Name, {in, {info, Msg}}),
try Module:handleInfo(Msg, CurState) of

Yükleniyor…
İptal
Kaydet