|
|
- -module(gTimer).
-
- -include("gTimer.hrl").
-
- -export([
- start/0
- , stop/0
- , startWork/1
- , setTimer/2
- , setTimer/3
- , getTimer/1
- , delTimer/1
- ]).
-
- timerName(Idx) ->
- binary_to_atom(<<"$gtWSork_", (integer_to_binary(Idx))/binary>>).
-
- -spec startWork(Cnt :: non_neg_integer()) -> ok | {error, term()}.
- startWork(Cnt) when Cnt > 0 ->
- case ?gTimerCfg:getV(?workCnt) of
- 0 ->
- NameList = [{Idx, timerName(Idx)} || Idx <- lists:seq(1, Cnt)],
- [supervisor:start_child(gTimer_sup, [WorkName]) || {_Idx, WorkName} <- NameList],
- CfgList = [{?workCnt, Cnt} | NameList],
- gtKvsToBeam:load(?gTimerCfg, CfgList),
- ok;
- _Cnt ->
- {error, started}
- end.
-
- start() ->
- application:ensure_all_started(gTimer).
-
- stop() ->
- gtKvsToBeam:load(?gTimerCfg, [{?workCnt, 0}]),
- application:stop(gTimer).
-
- -spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}) -> reference().
- setTimer(Time, MFA) ->
- Cnt = ?gTimerCfg:getV(?workCnt),
- Idx = rand:uniform(Cnt),
- erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
-
- -spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}, Strategy :: rand | bind) -> reference().
- setTimer(Time, MFA, Strategy) ->
- Cnt = ?gTimerCfg:getV(?workCnt),
- Idx = ?IIF(Strategy == rand, rand:uniform(Cnt), erlang:phash2(self(), Cnt) + 1),
- erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
-
- -spec getTimer(TimerRef :: reference()) -> false | non_neg_integer().
- getTimer(TimerRef) ->
- erlang:read_timer(TimerRef).
-
- -spec delTimer(TimerRef :: reference()) -> false | non_neg_integer().
- delTimer(TimerRef) ->
- erlang:cancel_timer(TimerRef) .
|