|
|
- %%%----------------------------------------------------------------------
- %%% File : game_timer.erl
- %%% Author : csj
- %%% Created : 2010-10-17
- %%% Description: 时间生成器
- %%%----------------------------------------------------------------------
- -module(game_timer).
-
- -behaviour(gen_server).
- %% --------------------------------------------------------------------
- %% Include files
- %% --------------------------------------------------------------------
- -include("common.hrl").
-
- %% --------------------------------------------------------------------
- %% External exports
- -export([now/0, now_seconds/0, cpu_time/0, start_link/0, start/1, info/0]).
-
- %% gen_server callbacks
- -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-
- %% ====================================================================
- %% External functions
- %% ====================================================================
- now() ->
- [{timer, {Now, _}}] = ets:lookup(ets_timer, timer),
- Now.
-
- now_seconds() ->
- [{timer, {Now, _}}] = ets:lookup(ets_timer, timer),
- {MegaSecs, Secs, _MicroSecs} = Now,
- lists:concat([MegaSecs, Secs]).
-
- cpu_time() ->
- [{timer, {_, Wallclock_Time_Since_Last_Call}}] = ets:lookup(ets_timer, timer),
- Wallclock_Time_Since_Last_Call.
-
- info() ->
- [
- ets:info(ets_timer),
- ets:tab2list(ets_timer)
- ].
-
- -define(CLOCK, 100).
-
- start(Sup) ->
- supervisor:start_child(Sup,
- {game_timer,
- {game_timer, start_link, []},
- permanent, brutal_kill, worker, [game_timer]}).
-
- %% ====================================================================
- %% Server functions
- %% ====================================================================
- start_link() ->
- gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
-
- %% --------------------------------------------------------------------
- %% Function: init/1
- %% Description: Initiates the server
- %% Returns: {ok, State} |
- %% {ok, State, Timeout} |
- %% ignore |
- %% {stop, Reason}
- %% --------------------------------------------------------------------
- init([]) ->
- ets:new(ets_timer, [set, protected, named_table]),
- ets:insert(ets_timer, {timer, {erlang:now(), 0}}),
- erlang:send_after(?CLOCK, self(), {event, clock}),
- misc:write_monitor_pid(self(), ?MODULE, {}),
- {ok, []}.
-
- %% --------------------------------------------------------------------
- %% Function: handle_call/3
- %% Description: Handling call messages
- %% Returns: {reply, Reply, State} |
- %% {reply, Reply, State, Timeout} |
- %% {noreply, State} |
- %% {noreply, State, Timeout} |
- %% {stop, Reason, Reply, State} | (terminate/2 is called)
- %% {stop, Reason, State} (terminate/2 is called)
- %% --------------------------------------------------------------------
- handle_call(_Request, _From, State) ->
- {reply, State, State}.
-
- %% --------------------------------------------------------------------
- %% Function: handle_cast/2
- %% Description: Handling cast messages
- %% Returns: {noreply, State} |
- %% {noreply, State, Timeout} |
- %% {stop, Reason, State} (terminate/2 is called)
- %% --------------------------------------------------------------------
- handle_cast(_Msg, State) ->
- {noreply, State}.
-
- %% --------------------------------------------------------------------
- %% Function: handle_info/2
- %% Description: Handling all non call/cast messages
- %% Returns: {noreply, State} |
- %% {noreply, State, Timeout} |
- %% {stop, Reason, State} (terminate/2 is called)
- %% --------------------------------------------------------------------
- handle_info({event, clock}, State) ->
- {_Total_Run_Time, Time_Since_Last_Call} = statistics(runtime),
- ets:insert(ets_timer, {timer, {erlang:now(), Time_Since_Last_Call}}),
- erlang:send_after(?CLOCK, self(), {event, clock}),
- {noreply, State};
-
- handle_info(_Info, State) ->
- {noreply, State}.
-
- %% --------------------------------------------------------------------
- %% Function: terminate/2
- %% Description: Shutdown the server
- %% Returns: any (ignored by gen_server)
- %% --------------------------------------------------------------------
- terminate(_Reason, _State) ->
- misc:delete_monitor_pid(self()),
- ok.
-
- %% --------------------------------------------------------------------
- %% Func: code_change/3
- %% Purpose: Convert process state when code is changed
- %% Returns: {ok, NewState}
- %% --------------------------------------------------------------------
- code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-
- %% --------------------------------------------------------------------
- %%% Internal functions
- %% --------------------------------------------------------------------
|