29c3edd50f501c1c40fef2b3cc351391c719b90b
[olsrd.git] / src / scheduler.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
5  * Timer rewrite (c) 2008, Hannes Gredler (hannes@gredler.at)
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  *   notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above copyright
15  *   notice, this list of conditions and the following disclaimer in
16  *   the documentation and/or other materials provided with the
17  *   distribution.
18  * * Neither the name of olsr.org, olsrd nor the names of its
19  *   contributors may be used to endorse or promote products derived
20  *   from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  * Visit http://www.olsr.org for more information.
36  *
37  * If you find this software useful feel free to make a donation
38  * to the project. For more information see the website or contact
39  * the copyright holders.
40  *
41  */
42
43 #ifndef _OLSR_SCHEDULER
44 #define _OLSR_SCHEDULER
45
46 #include "common/list.h"
47
48 #define TIMER_WHEEL_SLOTS 256
49 #define TIMER_WHEEL_MASK (TIMER_WHEEL_SLOTS - 1)
50
51 /* Some defs for juggling with timers */
52 #define MSEC_PER_SEC 1000
53 #define USEC_PER_SEC 1000000
54 #define NSEC_PER_USEC 1000
55 #define USEC_PER_MSEC 1000
56
57 /*
58  * Our timer implementation is a based on individual timers arranged in
59  * a double linked list hanging of hash containers called a timer wheel slot.
60  * For every timer a timer_entry is created and attached to the timer wheel slot.
61  * When the timer fires, the timer_cb function is called with the
62  * context pointer.
63  * The implementation supports periodic and oneshot timers.
64  * For a periodic timer the timer_period field is set to non zero,
65  * which causes the timer to run forever until manually stopped.
66  */
67 struct timer_entry {
68   struct list_node timer_list;         /* memory pooling, or wheel membership */
69   clock_t timer_clock;                 /* when timer shall fire (absolute time) */
70   unsigned int timer_period;           /* set for periodical timers (relative time) */
71   olsr_cookie_t timer_cookie;          /* used for diag stuff */
72   uint8_t timer_jitter_pct;            /* the jitter expressed in percent */
73   uint8_t timer_flags;                 /* misc flags */
74   unsigned int timer_random;           /* cache random() result for performance reasons */
75   void (*timer_cb) (void *);           /* callback function */
76   void *timer_cb_context;              /* context pointer */
77 };
78
79 /* inline to recast from timer_list back to timer_entry */
80 LISTNODE2STRUCT(list2timer, struct timer_entry, timer_list);
81
82 #define OLSR_TIMER_ONESHOT    0 /* One shot timer */
83 #define OLSR_TIMER_PERIODIC   1 /* Periodic timer */
84
85 /* Timer flags */
86 #define OLSR_TIMER_RUNNING  ( 1 << 0)   /* this timer is running */
87
88 /* Memory pooling */
89 #define OLSR_TIMER_MEMORY_CHUNK 100     /* timers per chunk */
90
91 /* Timers */
92 void olsr_init_timers(void);
93 void olsr_walk_timers(clock_t *);
94 void olsr_set_timer(struct timer_entry **, unsigned int, uint8_t, bool, void (*)(void *), void *, olsr_cookie_t);
95 struct timer_entry *olsr_start_timer(unsigned int, uint8_t, bool, void (*)(void *), void *, olsr_cookie_t);
96 void olsr_change_timer(struct timer_entry *, unsigned int, uint8_t, bool);
97 void olsr_stop_timer(struct timer_entry *);
98
99 /* Printing timestamps */
100 const char *olsr_clock_string(clock_t);
101 const char *olsr_wallclock_string(void);
102
103 /* Main scheduler loop */
104 void olsr_scheduler(void) __attribute__ ((noreturn));
105
106 #endif
107
108 /*
109  * Local Variables:
110  * c-basic-offset: 2
111  * indent-tabs-mode: nil
112  * End:
113  */