9b5195295d657dc5dc0d53702dea813025754347
[oonf.git] / include / oonf / subsystems / oonf_timer.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon version 2 (olsrd2)
4  * Copyright (c) 2004-2015, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /**
43  * @file
44  */
45
46 #ifndef OONF_TIMER_H_
47 #define OONF_TIMER_H_
48
49 #include <oonf/libcommon/avl.h>
50 #include <oonf/oonf.h>
51 #include <oonf/libcommon/list.h>
52
53 #include <oonf/subsystems/oonf_clock.h>
54
55 /*! subsystem identifier */
56 #define OONF_TIMER_SUBSYSTEM "timer"
57
58 struct oonf_timer_instance;
59
60 /*! timeslice of the scheduler */
61 #define OONF_TIMER_SLICE 100ull
62
63 /**
64  * This struct defines a class of timers which have the same
65  * type (periodic/non-periodic) and callback.
66  */
67 struct oonf_timer_class {
68   /*! node of timerinfo list */
69   struct list_entity _node;
70
71   /*! name of this timer class */
72   const char *name;
73
74   /**
75    * Callback when timer is triggered
76    * @param ptr pointer to timer instance that fired
77    */
78   void (*callback)(struct oonf_timer_instance *ptr);
79
80   /*! true if this is a class of periodic timers */
81   bool periodic;
82
83   /*! Number of times the timer is currently running */
84   uint32_t _stat_usage;
85
86   /*! Number of times the timer was reset */
87   uint32_t _stat_changes;
88
89   /*! number of times the timer fired */
90   uint32_t _stat_fired;
91
92   /*! number of times the timer took more than a timeslice */
93   uint32_t _stat_long;
94
95   /*! pointer to timer currently in callback */
96   struct oonf_timer_instance *_timer_in_callback;
97
98   /*! set to true if the current running timer has been stopped */
99   bool _timer_stopped;
100 };
101
102 /**
103  * A single timer instance of a timer class
104  */
105 struct oonf_timer_instance {
106   /*! node of timer class tree of instances */
107   struct avl_node _node;
108
109   /*! backpointer to timer class */
110   struct oonf_timer_class *class;
111
112   /*! the jitter expressed in percent */
113   uint8_t jitter_pct;
114
115   /*! timeperiod between two timer events for periodical timers */
116   uint64_t _period;
117
118   /*! cache random() result for performance reasons */
119   unsigned int _random;
120
121   /*! absolute timestamp when timer will fire */
122   uint64_t _clock;
123 };
124
125 /* Timers */
126 EXPORT void oonf_timer_walk(void);
127
128 EXPORT void oonf_timer_add(struct oonf_timer_class *ti);
129 EXPORT void oonf_timer_remove(struct oonf_timer_class *);
130
131 EXPORT void oonf_timer_set_ext(struct oonf_timer_instance *timer, uint64_t first, uint64_t interval);
132 EXPORT void oonf_timer_start_ext(struct oonf_timer_instance *timer, uint64_t first, uint64_t interval);
133 EXPORT void oonf_timer_stop(struct oonf_timer_instance *);
134
135 EXPORT uint64_t oonf_timer_getNextEvent(void);
136
137 EXPORT struct list_entity *oonf_timer_get_list(void);
138
139 /**
140  * @param timer pointer to timer
141  * @return true if the timer is running, false otherwise
142  */
143 static INLINE bool
144 oonf_timer_is_active(const struct oonf_timer_instance *timer) {
145   return timer->_clock != 0ull;
146 }
147
148 /**
149  * @param timer pointer to timer
150  * @return interval between timer events in milliseconds
151  */
152 static INLINE uint64_t
153 oonf_timer_get_period(const struct oonf_timer_instance *timer) {
154   return timer->_period;
155 }
156
157 /**
158  * @param timer pointer to timer
159  * @return number of milliseconds until timer fires
160  */
161 static INLINE int64_t
162 oonf_timer_get_due(const struct oonf_timer_instance *timer) {
163   return oonf_clock_get_relative(timer->_clock);
164 }
165
166 /**
167  * This is the one stop shop for all sort of timer manipulation.
168  * Depending on the passed in parameters a new timer is started,
169  * or an existing timer is started or an existing timer is
170  * terminated.
171  * @param timer timer_entry pointer
172  * @param rel_time relative time when the timer should fire
173  */
174 static INLINE void
175 oonf_timer_set(struct oonf_timer_instance *timer, uint64_t rel_time) {
176   oonf_timer_set_ext(timer, rel_time, rel_time);
177 }
178
179 /**
180  * Start or restart a new timer.
181  * @param timer initialized timer entry
182  * @param rel_time relative time when the timer should fire
183  */
184 static INLINE void
185 oonf_timer_start(struct oonf_timer_instance *timer, uint64_t rel_time) {
186   oonf_timer_start_ext(timer, rel_time, rel_time);
187 }
188
189 /**
190  * @param tc timer class
191  * @return number of timers currently in use
192  */
193 static INLINE uint32_t
194 oonf_timer_get_usage(struct oonf_timer_class *tc) {
195   return tc->_stat_usage;
196 }
197
198 /**
199  * @param tc timer class
200  * @return number of times the timer was reset
201  */
202 static INLINE uint32_t
203 oonf_timer_get_changes(struct oonf_timer_class *tc) {
204   return tc->_stat_changes;
205 }
206
207 /**
208  * @param tc timer class
209  * @return number of times the timer was fired
210  */
211 static INLINE uint32_t
212 oonf_timer_get_fired(struct oonf_timer_class *tc) {
213   return tc->_stat_fired;
214 }
215
216 /**
217  * @param tc timer class
218  * @return number of times the timer took more than a timeslice
219  */
220 static INLINE uint32_t
221 oonf_timer_get_long(struct oonf_timer_class *tc) {
222   return tc->_stat_long;
223 }
224
225 #endif /* OONF_TIMER_H_ */