4025a4983ae1b86dd8c57a7467b26e26ebcc753f
[sip-router] / modules / tm / timer.h
1 /*
2  * $Id$
3  */
4
5 #ifndef _TIMER_H
6 #define _TIMER_H
7
8 #include "lock.h"
9 #include "t_funcs.h"
10
11 /* timer timestamp value indicating a timer has been 
12    deactived and shall not be executed
13 */
14 #define TIMER_DELETED   1
15
16
17 #define is_in_timer_list2(_tl) ( (_tl)->timer_list )
18
19 /* identifiers of timer lists;*/
20 /* fixed-timer retransmission lists (benefit: fixed timer$
21    length allows for appending new items to the list as$
22    opposed to inserting them which is costly */
23 enum lists
24 {
25         FR_TIMER_LIST, FR_INV_TIMER_LIST,
26         WT_TIMER_LIST,
27         DELETE_LIST,
28         RT_T1_TO_1, RT_T1_TO_2, RT_T1_TO_3, RT_T2,
29         NR_OF_TIMER_LISTS
30 };
31
32 /* all you need to put a cell in a timer list
33    links to neighbours and timer value */
34 typedef struct timer_link
35 {
36         struct timer_link *next_tl;
37         struct timer_link *prev_tl;
38         volatile unsigned int       time_out;
39         void              *payload;
40         struct timer      *timer_list;
41         enum timer_groups  tg;
42 }timer_link_type ;
43
44
45 /* timer list: includes head, tail and protection semaphore */
46 typedef struct  timer
47 {
48         struct timer_link  first_tl;
49         struct timer_link  last_tl;
50         ser_lock_t*        mutex;
51         enum lists         id;
52 } timer_type;
53
54 /* transaction table */
55 struct timer_table
56 {
57     /* table of timer lists */
58     struct timer   timers[ NR_OF_TIMER_LISTS ];
59 };
60
61
62
63
64
65 extern int timer_group[NR_OF_TIMER_LISTS];
66 extern unsigned int timer_id2timeout[NR_OF_TIMER_LISTS];
67
68
69
70 struct timer_table * tm_init_timers();
71 void unlink_timer_lists();
72 void free_timer_table();
73 void init_timer_list( enum lists list_id);
74 void reset_timer_list( enum lists list_id);
75 void remove_timer_unsafe(  struct timer_link* tl ) ;
76 void add_timer_unsafe( struct timer*, struct timer_link*, unsigned int);
77 struct timer_link  *check_and_split_time_list( struct timer*, int);
78
79 void reset_timer( struct timer_link* tl );
80 /* determine timer length and put on a correct timer list */
81 void set_timer( struct timer_link *new_tl, enum lists list_id );
82 /* similar to set_timer, except it allows only one-time
83    timer setting and all later attempts are ignored */
84 void set_1timer( struct timer_link *new_tl, enum lists list_id );
85 void unlink_timers( struct cell *t );
86 void timer_routine(unsigned int, void*);
87
88
89 struct timer_table *get_timertable();
90
91 #endif