aboutsummaryrefslogtreecommitdiffstats
path: root/lib/megaco/src/engine/megaco_timer.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/megaco/src/engine/megaco_timer.erl')
-rw-r--r--lib/megaco/src/engine/megaco_timer.erl117
1 files changed, 117 insertions, 0 deletions
diff --git a/lib/megaco/src/engine/megaco_timer.erl b/lib/megaco/src/engine/megaco_timer.erl
new file mode 100644
index 0000000000..9f524523a8
--- /dev/null
+++ b/lib/megaco/src/engine/megaco_timer.erl
@@ -0,0 +1,117 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%%----------------------------------------------------------------------
+%% Purpose: Timer handling
+%%----------------------------------------------------------------------
+
+-module(megaco_timer).
+
+%% Application internal export
+-export([
+ init/1,
+ restart/1,
+ verify/1
+ ]).
+
+
+-include_lib("megaco/include/megaco.hrl").
+
+
+%%-----------------------------------------------------------------
+
+%% init(Timer) -> {TimeoutTime, NewTimer}
+%% Timer = megaco_timer()
+%% NewTimer = megaco_timer()
+%% TimeoutTime = infinity | integer()
+%%
+init(SingleWaitFor) when SingleWaitFor == infinity ->
+ {SingleWaitFor, timeout};
+init(SingleWaitFor) when is_integer(SingleWaitFor) and (SingleWaitFor >= 0) ->
+ {SingleWaitFor, timeout};
+init(Timer) when is_record(Timer, megaco_incr_timer) ->
+ return_incr(Timer).
+
+
+%% Returns {WaitFor, NewTimer} | {WaitFor, timeout}
+restart(#megaco_incr_timer{wait_for = Old,
+ factor = Factor,
+ incr = Incr,
+ max_retries = MaxRetries} = Timer) ->
+ New = wait_for(Old, Factor, Incr),
+ Max = decr(MaxRetries),
+ Timer2 = Timer#megaco_incr_timer{wait_for = New,
+ max_retries = Max},
+ return_incr(Timer2);
+restart({Timer, timeout}) when is_record(Timer, megaco_incr_timer) ->
+ restart(Timer).
+
+wait_for(Old, Factor, Incr) ->
+ New = (Old * Factor) + Incr,
+ if
+ New < 0 ->
+ 0;
+ true ->
+ New
+ end.
+
+verify(#megaco_incr_timer{wait_for = WaitFor,
+ factor = Factor,
+ incr = Incr,
+ max_retries = MaxRetries}) ->
+ (megaco_config:verify_strict_uint(WaitFor) and
+ megaco_config:verify_strict_uint(Factor) and
+ megaco_config:verify_strict_int(Incr) and
+ verify_max_retries(MaxRetries));
+verify(Timer) ->
+ megaco_config:verify_uint(Timer).
+
+verify_max_retries(infinity_restartable) ->
+ true;
+verify_max_retries(Val) ->
+ megaco_config:verify_uint(Val).
+
+
+%%-----------------------------------------------------------------
+
+
+return_incr(#megaco_incr_timer{wait_for = WaitFor,
+ max_retries = infinity} = Timer) ->
+ {WaitFor, Timer};
+
+return_incr(#megaco_incr_timer{wait_for = WaitFor,
+ max_retries = infinity_restartable} = Timer) ->
+ {WaitFor, {Timer, timeout}};
+
+return_incr(#megaco_incr_timer{wait_for = WaitFor,
+ max_retries = Int} = Timer)
+ when is_integer(Int) and (Int > 0) ->
+ {WaitFor, Timer};
+
+return_incr(#megaco_incr_timer{wait_for = WaitFor,
+ max_retries = 0} = _Timer) ->
+ {WaitFor, timeout}.
+
+
+decr(infinity = V) -> V;
+decr(infinity_restartable = V) -> V;
+decr(Int) when is_integer(Int) -> Int - 1.
+
+