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