diff --git a/src/gen_emm.erl b/src/gen_emm.erl index 7f19411..fd52248 100644 --- a/src/gen_emm.erl +++ b/src/gen_emm.erl @@ -14,7 +14,7 @@ , stop/1, stop/3 , call/3, call/4 , send/3 - , send_request/3, wait_response/2, check_response/2 + , send_request/3, wait_response/2, receive_response/2, check_response/2 , info_notify/2, call_notify/2 , add_epm/3, add_sup_epm/3, del_epm/3 , swap_epm/3, swap_sup_epm/3 @@ -104,6 +104,7 @@ {'ok', {pid(), reference()}} | {'error', term()}. +-type from() :: {To :: pid(), Tag :: term()}. -type requestId() :: term(). -record(epmHer, { @@ -267,14 +268,20 @@ send(EpmSrv, EpmHandler, Msg) -> send_request(EpmSrv, EpmHandler, Query) -> gen:send_request(EpmSrv, '$epm_call', {'$epmCall', EpmHandler, Query}). --spec wait_response(RequestId :: requestId(), timeout()) -> - {reply, Reply :: term()} | 'timeout' | {error, {Reason :: term(), serverRef()}}. +-spec wait_response(RequestId :: requestId(), timeout()) -> {reply, Reply :: term()} | 'timeout' | {error, {Reason :: term(), serverRef()}}. wait_response(RequestId, Timeout) -> case gen:wait_response(RequestId, Timeout) of {reply, {error, _} = Err} -> Err; Return -> Return end. +-spec receive_response(RequestId::requestId(), timeout()) -> {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), serverRef()}}. +receive_response(RequestId, Timeout) -> + case gen:receive_response(RequestId, Timeout) of + {reply, {error, _} = Err} -> Err; + Return -> Return + end. + -spec check_response(Msg :: term(), RequestId :: requestId()) -> {reply, Reply :: term()} | 'no_reply' | {error, {Reason :: term(), serverRef()}}. check_response(Msg, RequestId) -> @@ -287,8 +294,8 @@ epmRpc(EpmSrv, Cmd) -> try gen:call(EpmSrv, '$epm_call', Cmd, infinity) of {ok, Reply} -> Reply - catch Class:Reason:S -> - erlang:raise(Class, {Reason, {?MODULE, call, [EpmSrv, Cmd, infinity]}}, S) + catch Class:Reason -> + erlang:raise(Class, {Reason, {?MODULE, call, [EpmSrv, Cmd, infinity]}}, ?STACKTRACE()) end. epmRpc(EpmSrv, Cmd, Timeout) -> @@ -438,8 +445,8 @@ doAddEpm(EpmHers, {Module, _SubId} = EpmId, Args, EpmSup) -> catch throw:Ret -> addNewEpm(Ret, EpmHers, Module, EpmId, EpmSup); - C:R -> - {{error, {C, R, ?STACKTRACE()}}, EpmHers, false} + C:R:S -> + {{error, {C, R, S}}, EpmHers, false} end end; doAddEpm(EpmHers, Module, Args, EpmSup) -> @@ -453,8 +460,8 @@ doAddEpm(EpmHers, Module, Args, EpmSup) -> catch throw:Ret -> addNewEpm(Ret, EpmHers, Module, Module, EpmSup); - C:R -> - {{error, {C, R, ?STACKTRACE()}}, EpmHers, false} + C:R:S -> + {{error, {C, R, S}}, EpmHers, false} end end. @@ -675,6 +682,10 @@ epmTerminate(#epmHer{epmM = EpmM, epmS = State} = EpmHer, Args, LastIn, Reason) ok end. +-spec reply(From :: from(), Reply :: term()) -> ok. +reply({_To, [alias|Alias] = Tag}, Reply) -> + Alias ! {Tag, Reply}, + ok; reply({To, Ref}, Msg) -> try To ! {Ref, Msg}, ok @@ -684,6 +695,9 @@ reply({To, Ref}, Msg) -> try_reply(false, _Msg) -> ignore; +try_reply({_To, [alias|Alias] = Tag}, Reply) -> + Alias ! {Tag, Reply}, + ok; try_reply({To, Ref}, Msg) -> try To ! {Ref, Msg}, ok diff --git a/src/gen_ipc.erl b/src/gen_ipc.erl index 6c5f60f..9a72e81 100644 --- a/src/gen_ipc.erl +++ b/src/gen_ipc.erl @@ -13,7 +13,7 @@ , cast/2, send/2 , abcast/2, abcast/3 , call/2, call/3 - , send_request/2, wait_response/1, wait_response/2, check_response/2 + , send_request/2, wait_response/1, wait_response/2, receive_response/1, receive_response/2, check_response/2 , multi_call/2, multi_call/3, multi_call/4 , enter_loop/4, enter_loop/5, enter_loop/6 , reply/1, reply/2 @@ -365,7 +365,7 @@ doModuleInit(Module, Args) -> Module:init(Args) catch throw:Ret -> Ret; - Class:Reason -> {'EXIT', Class, Reason, ?STACKTRACE()} + Class:Reason:Stacktrace -> {'EXIT', Class, Reason, Stacktrace} end. init_it(Starter, self, ServerRef, Module, Args, Opts) -> @@ -685,6 +685,14 @@ wait_response(RequestId) -> wait_response(RequestId, Timeout) -> gen:wait_response(RequestId, Timeout). +-spec receive_response(RequestId::serverRef()) -> {reply, Reply::term()} | {error, {term(), serverRef()}}. +receive_response(RequestId) -> + gen:receive_response(RequestId, infinity). + +-spec receive_response(RequestId::requestId(), timeout()) -> {reply, Reply::term()} | 'timeout' | {error, {term(), serverRef()}}. +receive_response(RequestId, Timeout) -> + gen:receive_response(RequestId, Timeout). + -spec check_response(Msg :: term(), RequestId :: requestId()) -> {reply, Reply :: term()} | 'no_reply' | {error, {term(), serverRef()}}. check_response(Msg, RequestId) -> @@ -820,6 +828,9 @@ reply(Replies) when is_list(Replies) -> ok. -spec reply(From :: from(), Reply :: term()) -> ok. +reply({_To, [alias|Alias] = Tag}, Reply) -> + Alias ! {Tag, Reply}, + ok; reply({To, Tag}, Reply) -> try To ! {Tag, Reply}, ok @@ -937,8 +948,8 @@ doAddEpm(EpmHers, {Module, _SubId} = EpmId, Args, EpmSup) -> catch throw:Ret -> addNewEpm(Ret, EpmHers, Module, EpmId, EpmSup); - C:R -> - {{error, {C, R, ?STACKTRACE()}}, EpmHers, false} + C:R:S -> + {{error, {C, R, S}}, EpmHers, false} end end; doAddEpm(EpmHers, Module, Args, EpmSup) -> @@ -952,8 +963,8 @@ doAddEpm(EpmHers, Module, Args, EpmSup) -> catch throw:Ret -> addNewEpm(Ret, EpmHers, Module, Module, EpmSup); - C:R -> - {{error, {C, R, ?STACKTRACE()}}, EpmHers, false} + C:R:S -> + {{error, {C, R, S}}, EpmHers, false} end end. @@ -1012,8 +1023,8 @@ doEpmHandle(EpmHers, EpmHandler, Func, Event, From) -> catch throw:Ret -> handleEpmCR(Ret, EpmHers, EpmHer, Event, From); - C:R -> - epmTerminate(EpmHer, {error, {C, R, ?STACKTRACE()}}, Event, crash), + C:R:S -> + epmTerminate(EpmHer, {error, {C, R, S}}, Event, crash), NewEpmHers = maps:remove(EpmHandler, EpmHers), {NewEpmHers, false} end; @@ -1211,8 +1222,8 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post catch throw:Result -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, From); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) end. matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, Cast) -> @@ -1224,8 +1235,8 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post catch throw:Result -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) end. matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, Msg) -> @@ -1237,8 +1248,8 @@ matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post catch throw:Result -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) end. matchTimeoutMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, TimeoutType, TimeoutMsg) -> @@ -1250,8 +1261,8 @@ matchTimeoutMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, P catch throw:Result -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent], Result, ?CB_FORM_EVENT, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [CurEvent]) end. matchEpmCallMsg(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, From, Request) -> @@ -1309,8 +1320,8 @@ startEpmCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Post catch throw:Ret -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event], Ret, ?CB_FORM_EVENT, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event]) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, NewDebug, [Event]) end; _ -> receiveIng(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, IsHib) @@ -1323,8 +1334,8 @@ startEnterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po catch throw:Result -> handleEnterCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, PrevStatus, CurState, CurStatus, Debug, LeftEvents, NextEs, IsPos, IsHib, DoAfter, Result); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) end. startAfterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Args) -> @@ -1334,8 +1345,8 @@ startAfterCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po catch throw:Result -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Result, ?CB_FORM_AFTER, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) end. startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, {Type, Content}) -> @@ -1347,8 +1358,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po catch throw:Ret -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) end; 'info' -> try Module:handleInfo(Content, CurStatus, CurState) of @@ -1357,8 +1368,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po catch throw:Ret -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) end; {'call', From} -> try Module:handleCall(Content, CurStatus, CurState, From) of @@ -1367,8 +1378,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po catch throw:Ret -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, From); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) end; _ -> try Module:handleOnevent(Type, Content, CurStatus, CurState) of @@ -1377,8 +1388,8 @@ startEventCall(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Po catch throw:Ret -> handleEventCR(Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents, Ret, ?CB_FORM_EVENT, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Parent, Name, Module, HibernateAfterTimeout, IsEnter, EpmHers, Postponed, Timers, CurStatus, CurState, Debug, LeftEvents) end end. diff --git a/src/gen_srv.erl b/src/gen_srv.erl index 272a736..8c5f5f8 100644 --- a/src/gen_srv.erl +++ b/src/gen_srv.erl @@ -11,7 +11,7 @@ , start_monitor/3, start_monitor/4 , stop/1, stop/3 , call/2, call/3 - , send_request/2, wait_response/2, check_response/2 + , send_request/2, wait_response/2, receive_response/2, check_response/2 , cast/2, send/2, reply/1, reply/2 , abcast/2, abcast/3 , multi_call/2, multi_call/3, multi_call/4 @@ -197,7 +197,7 @@ doModuleInit(Module, Args) -> Module:init(Args) catch throw:Ret -> Ret; - Class:Reason -> {'EXIT', Class, Reason, ?STACKTRACE()} + Class:Reason:Strace -> {'EXIT', Class, Reason, Strace} end. init_it(Starter, self, ServerRef, Module, Args, Options) -> @@ -521,6 +521,9 @@ reply(Replies) when is_list(Replies) -> ok. -spec reply(From :: from(), Reply :: term()) -> ok. +reply({_To, [alias|Alias] = Tag}, Reply) -> + Alias ! {Tag, Reply}, + ok; reply({To, Tag}, Reply) -> try To ! {Tag, Reply}, ok @@ -542,6 +545,10 @@ send_request(Name, Request) -> wait_response(RequestId, Timeout) -> gen:wait_response(RequestId, Timeout). +-spec receive_response(RequestId::requestId(), timeout()) -> {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), serverRef()}}. +receive_response(RequestId, Timeout) -> + gen:receive_response(RequestId, Timeout). + -spec check_response(Msg :: term(), RequestId :: requestId()) -> {reply, Reply :: term()} | 'no_reply' | {error, {Reason :: term(), serverRef()}}. check_response(Msg, RequestId) -> @@ -708,8 +715,8 @@ matchCallMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, From); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {{call, From}, Request}) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {{call, From}, Request}) end. matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Cast) -> @@ -720,8 +727,8 @@ matchCastMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {cast, Cast}) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {cast, Cast}) end. matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Msg) -> @@ -732,8 +739,8 @@ matchInfoMsg(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurStat catch throw:Result -> handleCR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, Result, false); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {info, Msg}) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {info, Msg}) end. doAfterCall(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, LeftAction, Args) -> @@ -744,8 +751,8 @@ doAfterCall(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState catch throw:Result -> handleAR(Parent, Name, Module, HibernateAfterTimeout, NewDebug, Timers, CurState, LeftAction, Result); - Class:Reason -> - terminate(Class, Reason, ?STACKTRACE(), Name, Module, NewDebug, Timers, CurState, {doAfter, Args}) + Class:Reason:Strace -> + terminate(Class, Reason, Strace, Name, Module, NewDebug, Timers, CurState, {doAfter, Args}) end. handleCR(Parent, Name, Module, HibernateAfterTimeout, Debug, Timers, CurState, Result, From) ->