summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_timer.h
blob: 6531657dfe1163d8efca47f126b8fe7f2dcc9561 (plain) (blame)
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

/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) NGINX, Inc.
 */

#ifndef _NXT_TIMER_H_INCLUDED_
#define _NXT_TIMER_H_INCLUDED_


/* Valid values are between 1ms to 255ms. */
#define NXT_TIMER_DEFAULT_PRECISION  100
//#define NXT_TIMER_DEFAULT_PRECISION  1


typedef enum {
    NXT_TIMER_DISABLED = 0,
    NXT_TIMER_CHANGING,
    NXT_TIMER_WAITING,
    NXT_TIMER_ENQUEUED,
} nxt_timer_state_t;


typedef struct {
    /* The rbtree node must be the first field. */
    NXT_RBTREE_NODE           (node);

    nxt_timer_state_t         state:8;
    uint8_t                   precision;
    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, NXT_TIMER_DISABLED,     \
                                0, 0, NULL, NULL, NULL, NULL }


typedef enum {
    NXT_TIMER_ADD = 0,
    NXT_TIMER_DISABLE,
    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 void nxt_timer_disable(nxt_event_engine_t *engine,
    nxt_timer_t *timer);
NXT_EXPORT nxt_bool_t nxt_timer_delete(nxt_event_engine_t *engine,
    nxt_timer_t *timer);


#endif /* _NXT_TIMER_H_INCLUDED_ */