Rename olsr_time.[ch] to olsr_clock.[ch]
[olsrd.git] / src / olsr_timer.h
1 /*
2  * olsr_timer.h
3  *
4  *  Created on: Feb 14, 2011
5  *      Author: rogge
6  */
7
8 #ifndef OLSR_TIMER_H_
9 #define OLSR_TIMER_H_
10
11 #include "olsr_clock.h"
12 #include "common/list.h"
13 #include "common/avl.h"
14
15 #include "olsr_types.h"
16
17 #define TIMER_WHEEL_SLOTS 1024
18 #define TIMER_WHEEL_MASK (TIMER_WHEEL_SLOTS - 1)
19
20 /* prototype for timer callback */
21 typedef void (*timer_cb_func) (void *);
22
23 /*
24  * This struct defines a class of timers which have the same
25  * type (periodic/non-periodic) and callback.
26  */
27 struct olsr_timer_info {
28   /* node of timerinfo list */
29   struct list_entity node;
30
31   /* name of this timer class */
32   char *name;
33
34   /* callback function */
35   timer_cb_func callback;
36
37   /* true if this is a class of periodic timers */
38   bool periodic;
39
40   /* Stats, resource usage */
41   uint32_t usage;
42
43   /* Stats, resource churn */
44   uint32_t changes;
45 };
46
47
48 /*
49  * Our timer implementation is a based on individual timers arranged in
50  * a double linked list hanging of hash containers called a timer wheel slot.
51  * For every timer a olsr_timer_entry is created and attached to the timer wheel slot.
52  * When the timer fires, the timer_cb function is called with the
53  * context pointer.
54  */
55 struct olsr_timer_entry {
56   /* Wheel membership */
57   struct list_entity timer_list;
58
59   /* backpointer to timer info */
60   struct olsr_timer_info *timer_info;
61
62   /* when timer shall fire (absolute internal timerstamp) */
63   uint32_t timer_clock;
64
65   /* timeperiod between two timer events for periodical timers */
66   uint32_t timer_period;
67
68   /* the jitter expressed in percent */
69   uint8_t timer_jitter_pct;
70
71   /* true if timer is running at the moment */
72   bool timer_running;
73
74   /* true if timer is in callback at the moment */
75   bool timer_in_callback;
76
77   /* cache random() result for performance reasons */
78   unsigned int timer_random;
79
80   /* context pointer */
81   void *timer_cb_context;
82 };
83
84 /* buffer for displaying absolute timestamps */
85 struct timeval_buf {
86   char buf[sizeof("00:00:00.000000")];
87 };
88
89 /* Timers */
90 extern struct list_entity EXPORT(timerinfo_list);
91 #define OLSR_FOR_ALL_TIMERS(ti, iterator) list_for_each_element_safe(&timerinfo_list, ti, node, iterator)
92
93 void olsr_timer_init(void);
94 void olsr_timer_cleanup(void);
95 void olsr_timer_updateClock(void);
96
97 uint32_t EXPORT(olsr_timer_getAbsolute) (uint32_t relative);
98 int32_t EXPORT(olsr_timer_getRelative) (uint32_t absolute);
99 bool EXPORT(olsr_timer_isTimedOut) (uint32_t s);
100
101 /**
102  * Calculates the current time in the internal OLSR representation
103  * @return current time
104  */
105 static inline uint32_t olsr_timer_getNow(void) {
106   return olsr_timer_getAbsolute(0);
107 }
108
109 void EXPORT(olsr_timer_set) (struct olsr_timer_entry **, uint32_t, uint8_t,
110     void *, struct olsr_timer_info *);
111 struct olsr_timer_entry *EXPORT(olsr_timer_start) (uint32_t, uint8_t,
112     void *, struct olsr_timer_info *);
113 void EXPORT(olsr_timer_change)(struct olsr_timer_entry *, uint32_t, uint8_t);
114 void EXPORT(olsr_timer_stop) (struct olsr_timer_entry *);
115
116 struct olsr_timer_info *EXPORT(olsr_timer_add)(const char *name, timer_cb_func callback, bool periodic);
117
118 const char *EXPORT(olsr_timer_getClockString)(struct timeval_buf *, uint32_t);
119 const char *EXPORT(olsr_timer_getWallclockString)(struct timeval_buf *);
120
121 /* Main scheduler loop */
122 void olsr_timer_scheduler(void);
123
124 #endif /* OLSR_TIMER_H_ */