xref: /unit/src/nxt_timer.h (revision 1008:84f2370bd642)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #ifndef _NXT_TIMER_H_INCLUDED_
8 #define _NXT_TIMER_H_INCLUDED_
9 
10 
11 /* Valid values are between 0ms to 255ms. */
12 #define NXT_TIMER_DEFAULT_BIAS  50
13 //#define NXT_TIMER_DEFAULT_BIAS  0
14 
15 
16 /*
17  * The nxt_timer_t structure can hold up to 14 bits of change index,
18  * but 0 reserved for NXT_TIMER_NO_CHANGE.
19  */
20 #define NXT_TIMER_MAX_CHANGES  16383
21 #define NXT_TIMER_NO_CHANGE    0
22 
23 
24 typedef struct {
25     /* The rbtree node must be the first field. */
26     NXT_RBTREE_NODE           (node);
27 
28     uint8_t                   bias;
29 
30     uint16_t                  change:14;
31     uint16_t                  enabled:1;
32     uint16_t                  queued:1;
33 
34     nxt_msec_t                time;
35 
36     nxt_work_queue_t          *work_queue;
37     nxt_work_handler_t        handler;
38 
39     nxt_task_t                *task;
40     nxt_log_t                 *log;
41 } nxt_timer_t;
42 
43 
44 #define NXT_TIMER             { NXT_RBTREE_NODE_INIT, 0, NXT_TIMER_NO_CHANGE, \
45                                 0, 0, 0, NULL, NULL, NULL, NULL }
46 
47 
48 typedef enum {
49     NXT_TIMER_NOPE = 0,
50     NXT_TIMER_ADD,
51     NXT_TIMER_DELETE,
52 } nxt_timer_operation_t;
53 
54 
55 typedef struct {
56     nxt_timer_operation_t     change:8;
57     nxt_msec_t                time;
58     nxt_timer_t               *timer;
59 } nxt_timer_change_t;
60 
61 
62 typedef struct {
63     nxt_rbtree_t              tree;
64 
65     /* An overflown milliseconds counter. */
66     nxt_msec_t                now;
67     nxt_msec_t                minimum;
68 
69     nxt_uint_t                mchanges;
70     nxt_uint_t                nchanges;
71 
72     nxt_timer_change_t        *changes;
73 } nxt_timers_t;
74 
75 
76 #define nxt_timer_data(obj, type, timer)                                      \
77     nxt_container_of(obj, type, timer)
78 
79 
80 /*
81  * When timer resides in rbtree all links of its node are not NULL.
82  * A parent link is the nearst to other timer flags.
83  */
84 
85 #define nxt_timer_is_in_tree(timer)                                           \
86     ((timer)->node.parent != NULL)
87 
88 #define nxt_timer_in_tree_set(timer)
89     /* Noop, because rbtree insertion sets a node's parent link. */
90 
91 #define nxt_timer_in_tree_clear(timer)                                        \
92     (timer)->node.parent = NULL
93 
94 
95 nxt_int_t nxt_timers_init(nxt_timers_t *timers, nxt_uint_t mchanges);
96 nxt_msec_t nxt_timer_find(nxt_event_engine_t *engine);
97 void nxt_timer_expire(nxt_event_engine_t *engine, nxt_msec_t now);
98 
99 NXT_EXPORT void nxt_timer_add(nxt_event_engine_t *engine, nxt_timer_t *timer,
100     nxt_msec_t timeout);
101 NXT_EXPORT nxt_bool_t nxt_timer_delete(nxt_event_engine_t *engine,
102     nxt_timer_t *timer);
103 
104 nxt_inline void
nxt_timer_disable(nxt_event_engine_t * engine,nxt_timer_t * timer)105 nxt_timer_disable(nxt_event_engine_t *engine, nxt_timer_t *timer)
106 {
107     nxt_debug(timer->task, "timer disable: %M", timer->time);
108 
109     timer->enabled = 0;
110 }
111 
112 
113 #endif /* _NXT_TIMER_H_INCLUDED_ */
114