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