diff options
Diffstat (limited to 'lib/kernel/src/erl_epmd.erl')
-rw-r--r-- | lib/kernel/src/erl_epmd.erl | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/kernel/src/erl_epmd.erl b/lib/kernel/src/erl_epmd.erl index 7cc84b2475..96806ae3e7 100644 --- a/lib/kernel/src/erl_epmd.erl +++ b/lib/kernel/src/erl_epmd.erl @@ -53,13 +53,15 @@ -import(lists, [reverse/1]). --record(state, {socket, port_no = -1, name = ""}). +-record(state, {socket, port_no = -1, name = "", family}). -type state() :: #state{}. -include("inet_int.hrl"). -include("erl_epmd.hrl"). -include_lib("kernel/include/inet.hrl"). +-define(RECONNECT_TIME, 2000). + %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- @@ -228,7 +230,8 @@ handle_call({register, Name, PortNo, Family}, _From, State) -> {alive, Socket, Creation} -> S = State#state{socket = Socket, port_no = PortNo, - name = Name}, + name = Name, + family = Family}, {reply, {ok, Creation}, S}; Error -> case init:get_argument(erl_epmd_port) of @@ -263,7 +266,17 @@ handle_cast(_, State) -> -spec handle_info(term(), state()) -> {'noreply', state()}. handle_info({tcp_closed, Socket}, State) when State#state.socket =:= Socket -> + erlang:send_after(?RECONNECT_TIME, self(), reconnect), {noreply, State#state{socket = -1}}; +handle_info(reconnect, State) when State#state.socket =:= -1 -> + case do_register_node(State#state.name, State#state.port_no, State#state.family) of + {alive, Socket, _Creation} -> + %% ignore the received creation + {noreply, State#state{socket = Socket}}; + _Error -> + erlang:send_after(?RECONNECT_TIME, self(), reconnect), + {noreply, State} + end; handle_info(_, State) -> {noreply, State}. |