diff --git a/src/gen_apu.erl b/src/gen_apu.erl index 6072892..2815541 100644 --- a/src/gen_apu.erl +++ b/src/gen_apu.erl @@ -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