pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36196?usp=email )
Change subject: Move spawn_wait_ret() to a new misc.erl file ......................................................................
Move spawn_wait_ret() to a new misc.erl file
It may be reused by other modules spawning process per message, like gsup_server.erl.
Change-Id: I9777b73942e9dc672dd944a82045710b78893974 --- M src/epdg_gtpc_s2b.erl A src/misc.erl 2 files changed, 68 insertions(+), 20 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/96/36196/1
diff --git a/src/epdg_gtpc_s2b.erl b/src/epdg_gtpc_s2b.erl index a8a42a2..dce038f 100644 --- a/src/epdg_gtpc_s2b.erl +++ b/src/epdg_gtpc_s2b.erl @@ -188,10 +188,10 @@ %% @callback gen_server handle_info({udp, _Socket, IP, InPortNo, RxMsg}, State) -> lager:debug("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, RxMsg]), - spawn_wait_ret(fun() -> - rx_udp(IP, InPortNo, RxMsg, State) - end, - {noreply, State}); + misc:spawn_wait_ret(fun() -> + rx_udp(IP, InPortNo, RxMsg, State) + end, + {noreply, State}); handle_info(Info, State) -> lager:info("S2b handle_info: ~p ~n", [Info]), {noreply, State}. @@ -378,22 +378,6 @@ connect(Address) -> connect(?SVC_NAME, Address).
-%% Calls Fun on a spawned monitored process and returns Fun ret. -%% If spawned process crashes, return DefaultRet. -spawn_wait_ret(Fun, DefaultRet) -> - MyPID=self(), - {Pid, MRef} = spawn_monitor(fun() -> - Ret = Fun(), - MyPID ! {self(), Ret} - end), - receive - {'DOWN', MRef, process, _, _Reason} -> - DefaultRet; - {Pid, Ret} -> - erlang:demonitor(MRef, [flush]), - Ret - end. - rx_udp(IP, InPortNo, RxMsg, State) -> Req = gtp_packet:decode(RxMsg), lager:debug("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, Req]), diff --git a/src/misc.erl b/src/misc.erl new file mode 100644 index 0000000..fd85264 --- /dev/null +++ b/src/misc.erl @@ -0,0 +1,52 @@ +% Misc helpers +% (C) 2023 by sysmocom +% +% All Rights Reserved +% +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU Affero General Public License as +% published by the Free Software Foundation; either version 3 of the +% License, or (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU Affero General Public License +% along with this program. If not, see http://www.gnu.org/licenses/. +% +% Additional Permission under GNU AGPL version 3 section 7: +% +% If you modify this Program, or any covered work, by linking or +% combining it with runtime libraries of Erlang/OTP as released by +% Ericsson on http://www.erlang.org (or a modified version of these +% libraries), containing parts covered by the terms of the Erlang Public +% License (http://www.erlang.org/EPLICENSE), the licensors of this +% Program grant you additional permission to convey the resulting work +% without the need to license the runtime libraries of Erlang/OTP under +% the GNU Affero General Public License. Corresponding Source for a +% non-source form of such a combination shall include the source code +% for the parts of the runtime libraries of Erlang/OTP used as well as +% that of the covered work. +% +-module(misc). +-author('Pau Espin Pedrol pespin@sysmocom.de'). + +-export([spawn_wait_ret/2]). + +%% Calls Fun on a spawned monitored process and returns Fun ret. +%% If spawned process crashes, return DefaultRet. +spawn_wait_ret(Fun, DefaultRet) -> + MyPID=self(), + {Pid, MRef} = spawn_monitor(fun() -> + Ret = Fun(), + MyPID ! {self(), Ret} + end), + receive + {'DOWN', MRef, process, _, _Reason} -> + DefaultRet; + {Pid, Ret} -> + erlang:demonitor(MRef, [flush]), + Ret + end. \ No newline at end of file