From 5a43afd07f530f6a5a5f7f4c6dc8d89df6ac62f0 Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Wed, 29 Apr 2015 16:23:26 +0800 Subject: [PATCH] start_tick, stop_tick --- apps/emqttd/src/emqttd_broker.erl | 33 ++++++++++++++++++++++++------ apps/emqttd/src/emqttd_metrics.erl | 5 ++--- apps/emqttd/src/emqttd_stats.erl | 7 +++---- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/apps/emqttd/src/emqttd_broker.erl b/apps/emqttd/src/emqttd_broker.erl index 811bef7e7..52ee832d0 100644 --- a/apps/emqttd/src/emqttd_broker.erl +++ b/apps/emqttd/src/emqttd_broker.erl @@ -45,6 +45,9 @@ %% Broker API -export([env/1, version/0, uptime/0, datetime/0, sysdescr/0]). +%% Tick API +-export([start_tick/1, stop_tick/1]). + %% gen_server Function Exports -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -124,6 +127,27 @@ datetime() -> io_lib:format( "~4..0w-~2..0w-~2..0w ~2..0w:~2..0w:~2..0w", [Y, M, D, H, MM, S])). +%%------------------------------------------------------------------------------ +%% @doc Start a tick timer +%% @end +%%------------------------------------------------------------------------------ +start_tick(Msg) -> + start_tick(timer:seconds(env(sys_interval)), Msg). + +start_tick(0, _Msg) -> + undefined; +start_tick(Interval, Msg) when Interval > 0 -> + {ok, TRef} = timer:send_interval(Interval, Msg), TRef. + +%%------------------------------------------------------------------------------ +%% @doc Start tick timer +%% @end +%%------------------------------------------------------------------------------ +stop_tick(undefined) -> + ok; +stop_tick(TRef) -> + timer:cancel(TRef). + %%%============================================================================= %%% gen_server callbacks %%%============================================================================= @@ -134,10 +158,7 @@ init([]) -> % Create $SYS Topics [ok = create_topic(Topic) || Topic <- ?SYSTOP_BROKERS], % Tick - SysInterval = env(sys_interval), - {ok, TRef} = timer:send_interval(timer:seconds(SysInterval), tick), - State = #state{started_at = os:timestamp(), sys_interval = SysInterval, tick_tref = TRef}, - {ok, State, hibernate}. + {ok, #state{started_at = os:timestamp(), tick_tref = start_tick(tick)}, hibernate}. handle_call(uptime, _From, State) -> {reply, uptime(State), State}; @@ -158,8 +179,8 @@ handle_info(tick, State) -> handle_info(_Info, State) -> {noreply, State}. -terminate(_Reason, _State) -> - ok. +terminate(_Reason, #state{tick_tref = TRef}) -> + stop_tick(TRef). code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/apps/emqttd/src/emqttd_metrics.erl b/apps/emqttd/src/emqttd_metrics.erl index 98d2ec81c..085d7c98f 100644 --- a/apps/emqttd/src/emqttd_metrics.erl +++ b/apps/emqttd/src/emqttd_metrics.erl @@ -165,8 +165,7 @@ init([]) -> % $SYS Topics for metrics [ok = create_topic(Topic) || {_, Topic} <- Metrics], % Tick to publish metrics - {ok, TRef} = timer:send_interval(timer:seconds(emqttd_broker:env(sys_interval)), tick), - {ok, #state{tick_tref = TRef}, hibernate}. + {ok, #state{tick_tref = emqttd_broker:start_tick(tick)}, hibernate}. handle_call(_Req, _From, State) -> {reply, error, State}. @@ -183,7 +182,7 @@ handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, #state{tick_tref = TRef}) -> - timer:cancel(TRef), ok. + emqttd_broker:stop_tick(TRef). code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/apps/emqttd/src/emqttd_stats.erl b/apps/emqttd/src/emqttd_stats.erl index 550d7aa89..e558c94ae 100644 --- a/apps/emqttd/src/emqttd_stats.erl +++ b/apps/emqttd/src/emqttd_stats.erl @@ -128,8 +128,7 @@ init([]) -> % Create $SYS Topics [ok = emqttd_pubsub:create(emqtt_topic:systop(Topic)) || Topic <- Topics], % Tick to publish stats - {ok, TRef} = timer:send_interval(timer:seconds(emqttd_broker:env(sys_interval)), tick), - {ok, #state{tick_tref = TRef}, hibernate}. + {ok, #state{tick_tref = emqttd_broker:start_tick(tick)}, hibernate}. handle_call(_Request, _From, State) -> {reply, error, State}. @@ -137,6 +136,7 @@ handle_call(_Request, _From, State) -> handle_cast(_Msg, State) -> {noreply, State}. +%% Interval Tick. handle_info(tick, State) -> [publish(Stat, Val) || {Stat, Val} <- ets:tab2list(?STATS_TAB)], {noreply, State, hibernate}; @@ -145,7 +145,7 @@ handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, #state{tick_tref = TRef}) -> - timer:cancel(TRef), ok. + emqttd_broker:stop_tick(TRef). code_change(_OldVsn, State, _Extra) -> {ok, State}. @@ -157,4 +157,3 @@ publish(Stat, Val) -> emqttd_pubsub:publish(stats, #mqtt_message{topic = emqtt_topic:systop(Stat), payload = emqttd_util:integer_to_binary(Val)}). -