diff --git a/src/emqx_connection.erl b/src/emqx_connection.erl index 28ea67bf8..92778f7a8 100644 --- a/src/emqx_connection.erl +++ b/src/emqx_connection.erl @@ -269,17 +269,20 @@ exit_on_sock_error(Reason) -> recvloop(Parent, State = #state{idle_timeout = IdleTimeout}) -> receive - {system, From, Request} -> - sys:handle_system_msg(Request, From, Parent, ?MODULE, [], State); - {'EXIT', Parent, Reason} -> - terminate(Reason, State); Msg -> - process_msg([Msg], Parent, ensure_stats_timer(IdleTimeout, State)) + handle_recv(Msg, Parent, State) after IdleTimeout + 100 -> hibernate(Parent, cancel_stats_timer(State)) end. +handle_recv({system, From, Request}, Parent, State) -> + sys:handle_system_msg(Request, From, Parent, ?MODULE, [], State); +handle_recv({'EXIT', Parent, Reason}, Parent, State) -> + terminate(Reason, State); +handle_recv(Msg, Parent, State = #state{idle_timeout = IdleTimeout}) -> + process_msg([Msg], Parent, ensure_stats_timer(IdleTimeout, State)). + hibernate(Parent, State) -> proc_lib:hibernate(?MODULE, wakeup_from_hib, [Parent, State]).