diff --git a/src/gen_apu.erl b/src/gen_apu.erl index 41b3e15..17bb842 100644 --- a/src/gen_apu.erl +++ b/src/gen_apu.erl @@ -5,7 +5,7 @@ -include_lib("kernel/include/logger.hrl"). --import(gen_call, [gcall/3, gcall/4, greply/2]). +-import(gen_call, [gcall/3, gcall/4, greply/2, try_greply/2]). -export([ %% API for gen_apu @@ -756,6 +756,9 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, From, false); + error:undef -> + try_greply(From, {error, undef}), + receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); Class:Reason:Strace -> terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {{call, From}, Request}) end. @@ -776,6 +779,8 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false, false); + error:undef -> + receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); Class:Reason:Strace -> terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {cast, Cast}) end. @@ -796,6 +801,9 @@ matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, F catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, From, true); + error:undef -> + try_greply(From, {error, undef}), + receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); Class:Reason:Strace -> terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {mfa, MFA}) end. diff --git a/src/gen_call.erl b/src/gen_call.erl index d94b55d..da46a0d 100644 --- a/src/gen_call.erl +++ b/src/gen_call.erl @@ -1,6 +1,6 @@ -module(gen_call). --export([gcall/3, gcall/4, greply/2]). +-export([gcall/3, gcall/4, greply/2, try_greply/2]). -define(default_timeout, 5000). @@ -126,4 +126,9 @@ greply({_To, [alias | Alias] = Tag}, Reply) when is_reference(Alias) -> greply({_To, [[alias | Alias] | _] = Tag}, Reply) when is_reference(Alias) -> Alias ! {Tag, Reply}, ok; greply({To, Tag}, Reply) -> - try To ! {Tag, Reply}, ok catch _:_ -> ok end. \ No newline at end of file + try To ! {Tag, Reply}, ok catch _:_ -> ok end. + +try_greply(false, _Msg) -> + ignore; +try_greply(From, Reply) -> + greply(From, Reply). \ No newline at end of file diff --git a/src/gen_emm.erl b/src/gen_emm.erl index 3293689..31ced81 100644 --- a/src/gen_emm.erl +++ b/src/gen_emm.erl @@ -6,7 +6,7 @@ -include_lib("kernel/include/logger.hrl"). -import(maps, [iterator/1, next/1]). --import(gen_call, [gcall/3, gcall/4, greply/2]). +-import(gen_call, [gcall/3, gcall/4, greply/2, try_greply/2]). -export([ %% API for gen_emm @@ -533,7 +533,7 @@ doEpmHandle(EpmHers, EpmId, Func, Event, From) -> maps:remove(EpmId, EpmHers) end; _ -> - try_reply(From, {error, bad_module}), + try_greply(From, {error, bad_module}), EpmHers end. @@ -691,11 +691,6 @@ epmTerminate(#epmHer{epmM = EpmM, epmS = State} = EpmHer, Args, LastIn, Reason) reply(From, Reply) -> greply(From, Reply). -try_reply(false, _Msg) -> - ignore; -try_reply(From, Reply) -> - greply(From, Reply). - terminate_server(Reason, _Parent, _ServerName, EpmHers) -> epmStopAll(EpmHers), exit(Reason). diff --git a/src/gen_ipc.erl b/src/gen_ipc.erl index 7ceddd9..a82e530 100644 --- a/src/gen_ipc.erl +++ b/src/gen_ipc.erl @@ -6,7 +6,7 @@ -include_lib("kernel/include/logger.hrl"). -import(maps, [iterator/1, next/1]). --import(gen_call, [gcall/3, gcall/4, greply/2]). +-import(gen_call, [gcall/3, gcall/4, greply/2, try_greply/2]). -export([ %% API for gen_server or gen_statem behaviour @@ -793,11 +793,6 @@ reply(Replies) when is_list(Replies) -> reply(From, Reply) -> greply(From, Reply). -try_reply(false, _Msg) -> - ignore; -try_reply(From, Reply) -> - greply(From, Reply). - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% API helpers end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% gen_event start %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% epmRequest({global, Name}, Msg) -> @@ -980,7 +975,7 @@ doEpmHandle(EpmHers, EpmHandler, Func, Event, From) -> {NewEpmHers, false} end; _ -> - try_reply(From, {error, bad_module}), + try_greply(From, {error, bad_module}), {EpmHers, false} end. diff --git a/src/gen_mpp.erl b/src/gen_mpp.erl index d243521..773d79b 100644 --- a/src/gen_mpp.erl +++ b/src/gen_mpp.erl @@ -5,7 +5,7 @@ -include_lib("kernel/include/logger.hrl"). --import(gen_call, [gcall/3, gcall/4, greply/2]). +-import(gen_call, [gcall/3, gcall/4, greply/2, try_greply/2]). -export([ %% API for gen_mpp @@ -740,6 +740,9 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, From, false); + error:undef -> + try_greply(From, {error, undef}), + receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); Class:Reason:Strace -> terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {{call, From}, Request}) end. @@ -760,6 +763,8 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false, false); + error:undef -> + receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); Class:Reason:Strace -> terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {cast, Cast}) end. @@ -780,6 +785,9 @@ matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, F catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, From, true); + error:undef -> + try_greply(From, {error, undef}), + receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); Class:Reason:Strace -> terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {mfa, MFA}) end. diff --git a/src/gen_srv.erl b/src/gen_srv.erl index 6039d07..3588aa1 100644 --- a/src/gen_srv.erl +++ b/src/gen_srv.erl @@ -5,7 +5,7 @@ -include_lib("kernel/include/logger.hrl"). --import(gen_call, [gcall/3, gcall/4, greply/2]). +-import(gen_call, [gcall/3, gcall/4, greply/2, try_greply/2]). -export([ %% API for gen_srv @@ -238,7 +238,6 @@ init_it(Starter, Parent, ServerRef, Module, Args, Options) -> exit(Error) end. - %%----------------------------------------------------------------- %% enter_loop(Module, Options, State, , ) ->_ %% @@ -776,6 +775,9 @@ matchMFA(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, F catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, From, true); + error:undef -> + try_greply(From, {error, undef}), + receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); Class:Reason:Strace -> terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {mfa, MFA}) end. @@ -809,13 +811,13 @@ handleCR(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, R kpS -> receiveIng(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, false); {reply, Reply} -> - reply(From, Reply), + greply(From, Reply), NewDebug = ?SYS_DEBUG(Debug, Name, {out, Reply, From, CurState}), receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, false); {noreply, NewState} -> receiveIng(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, NewState, false); {reply, Reply, NewState} -> - reply(From, Reply), + greply(From, Reply), NewDebug = ?SYS_DEBUG(Debug, Name, {out, Reply, From, NewState}), receiveIng(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, NewState, false); {noreply, NewState, Actions} -> @@ -823,7 +825,7 @@ handleCR(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, R {stop, Reason, NewState} -> terminate(exit, Reason, ?STACKTRACE(), Name, Module, Debug, Timers, NewState, {return, stop}); {reply, Reply, NewState, Actions} -> - reply(From, Reply), + greply(From, Reply), NewDebug = ?SYS_DEBUG(Debug, Name, {out, Reply, From, NewState}), loopEntry(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, NewState, listify(Actions)); {stopReply, Reason, Reply, NewState} -> @@ -831,7 +833,7 @@ handleCR(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, R try terminate(exit, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, NewState, {return, stop_reply}) after - _ = reply(From, Reply) + _ = greply(From, Reply) end; _AnyRet -> case IsAnyRet of