xref: /unit/src/nxt_timer.h (revision 811)
16Sigor@sysoev.ru 
26Sigor@sysoev.ru /*
36Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
46Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
56Sigor@sysoev.ru  */
66Sigor@sysoev.ru 
76Sigor@sysoev.ru #ifndef _NXT_TIMER_H_INCLUDED_
86Sigor@sysoev.ru #define _NXT_TIMER_H_INCLUDED_
96Sigor@sysoev.ru 
106Sigor@sysoev.ru 
11*811Svbart@nginx.com /* Valid values are between 0ms to 255ms. */
12*811Svbart@nginx.com #define NXT_TIMER_DEFAULT_BIAS  50
13*811Svbart@nginx.com //#define NXT_TIMER_DEFAULT_BIAS  0
146Sigor@sysoev.ru 
156Sigor@sysoev.ru 
16809Svbart@nginx.com /*
17809Svbart@nginx.com  * The nxt_timer_t structure can hold up to 14 bits of change index,
18809Svbart@nginx.com  * but 0 reserved for NXT_TIMER_NO_CHANGE.
19809Svbart@nginx.com  */
20809Svbart@nginx.com #define NXT_TIMER_MAX_CHANGES  16383
21809Svbart@nginx.com #define NXT_TIMER_NO_CHANGE    0
226Sigor@sysoev.ru 
236Sigor@sysoev.ru 
246Sigor@sysoev.ru typedef struct {
256Sigor@sysoev.ru     /* The rbtree node must be the first field. */
266Sigor@sysoev.ru     NXT_RBTREE_NODE           (node);
276Sigor@sysoev.ru 
28*811Svbart@nginx.com     uint8_t                   bias;
29809Svbart@nginx.com 
30809Svbart@nginx.com     uint16_t                  change:14;
31809Svbart@nginx.com     uint16_t                  enabled:1;
32809Svbart@nginx.com     uint16_t                  queued:1;
33809Svbart@nginx.com 
346Sigor@sysoev.ru     nxt_msec_t                time;
356Sigor@sysoev.ru 
366Sigor@sysoev.ru     nxt_work_queue_t          *work_queue;
376Sigor@sysoev.ru     nxt_work_handler_t        handler;
386Sigor@sysoev.ru 
396Sigor@sysoev.ru     nxt_task_t                *task;
406Sigor@sysoev.ru     nxt_log_t                 *log;
416Sigor@sysoev.ru } nxt_timer_t;
426Sigor@sysoev.ru 
436Sigor@sysoev.ru 
44809Svbart@nginx.com #define NXT_TIMER             { NXT_RBTREE_NODE_INIT, 0, NXT_TIMER_NO_CHANGE, \
45809Svbart@nginx.com                                 0, 0, 0, NULL, NULL, NULL, NULL }
467Sigor@sysoev.ru 
477Sigor@sysoev.ru 
487Sigor@sysoev.ru typedef enum {
49809Svbart@nginx.com     NXT_TIMER_NOPE = 0,
50809Svbart@nginx.com     NXT_TIMER_ADD,
517Sigor@sysoev.ru     NXT_TIMER_DELETE,
527Sigor@sysoev.ru } nxt_timer_operation_t;
537Sigor@sysoev.ru 
547Sigor@sysoev.ru 
556Sigor@sysoev.ru typedef struct {
567Sigor@sysoev.ru     nxt_timer_operation_t     change:8;
576Sigor@sysoev.ru     nxt_msec_t                time;
586Sigor@sysoev.ru     nxt_timer_t               *timer;
596Sigor@sysoev.ru } nxt_timer_change_t;
606Sigor@sysoev.ru 
616Sigor@sysoev.ru 
626Sigor@sysoev.ru typedef struct {
636Sigor@sysoev.ru     nxt_rbtree_t              tree;
646Sigor@sysoev.ru 
656Sigor@sysoev.ru     /* An overflown milliseconds counter. */
666Sigor@sysoev.ru     nxt_msec_t                now;
677Sigor@sysoev.ru     nxt_msec_t                minimum;
686Sigor@sysoev.ru 
696Sigor@sysoev.ru     nxt_uint_t                mchanges;
706Sigor@sysoev.ru     nxt_uint_t                nchanges;
716Sigor@sysoev.ru 
726Sigor@sysoev.ru    nxt_timer_change_t         *changes;
736Sigor@sysoev.ru } nxt_timers_t;
746Sigor@sysoev.ru 
756Sigor@sysoev.ru 
766Sigor@sysoev.ru #define nxt_timer_data(obj, type, timer)                                      \
776Sigor@sysoev.ru     nxt_container_of(obj, type, timer)
786Sigor@sysoev.ru 
796Sigor@sysoev.ru 
806Sigor@sysoev.ru /*
816Sigor@sysoev.ru  * When timer resides in rbtree all links of its node are not NULL.
826Sigor@sysoev.ru  * A parent link is the nearst to other timer flags.
836Sigor@sysoev.ru  */
846Sigor@sysoev.ru 
856Sigor@sysoev.ru #define nxt_timer_is_in_tree(timer)                                           \
866Sigor@sysoev.ru     ((timer)->node.parent != NULL)
876Sigor@sysoev.ru 
886Sigor@sysoev.ru #define nxt_timer_in_tree_set(timer)
896Sigor@sysoev.ru     /* Noop, because rbtree insertion sets a node's parent link. */
906Sigor@sysoev.ru 
916Sigor@sysoev.ru #define nxt_timer_in_tree_clear(timer)                                        \
926Sigor@sysoev.ru     (timer)->node.parent = NULL
936Sigor@sysoev.ru 
946Sigor@sysoev.ru 
957Sigor@sysoev.ru nxt_int_t nxt_timers_init(nxt_timers_t *timers, nxt_uint_t mchanges);
967Sigor@sysoev.ru nxt_msec_t nxt_timer_find(nxt_event_engine_t *engine);
977Sigor@sysoev.ru void nxt_timer_expire(nxt_event_engine_t *engine, nxt_msec_t now);
986Sigor@sysoev.ru 
996Sigor@sysoev.ru NXT_EXPORT void nxt_timer_add(nxt_event_engine_t *engine, nxt_timer_t *timer,
1006Sigor@sysoev.ru     nxt_msec_t timeout);
1017Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_timer_delete(nxt_event_engine_t *engine,
1027Sigor@sysoev.ru     nxt_timer_t *timer);
1036Sigor@sysoev.ru 
104809Svbart@nginx.com nxt_inline void
105809Svbart@nginx.com nxt_timer_disable(nxt_event_engine_t *engine, nxt_timer_t *timer)
106809Svbart@nginx.com {
107809Svbart@nginx.com     nxt_debug(timer->task, "timer disable: %M", timer->time);
108809Svbart@nginx.com 
109809Svbart@nginx.com     timer->enabled = 0;
110809Svbart@nginx.com }
111809Svbart@nginx.com 
1126Sigor@sysoev.ru 
1136Sigor@sysoev.ru #endif /* _NXT_TIMER_H_INCLUDED_ */
114