blob: 5663f54816dad4c88c98fbecd48daadc27951bbf [file] [log] [blame]
Igor Sysoev6b7cfab2003-01-21 17:36:01 +00001
Igor Sysoevfcce8d52003-01-23 18:47:54 +00002#include <ngx_config.h>
Igor Sysoev6b7cfab2003-01-21 17:36:01 +00003
Igor Sysoevfcce8d52003-01-23 18:47:54 +00004#include <ngx_core.h>
5#include <ngx_log.h>
6#include <ngx_alloc.h>
7#include <ngx_connection.h>
8#include <ngx_event.h>
9
10#include <ngx_event_timer.h>
11
12/* STUB */
13#define NGX_TIMER_HASH_SIZE 5
14
15ngx_event_t *ngx_timer_queue;
16int ngx_timer_hash_size;
17
18
19int ngx_event_init_timer(ngx_log_t *log)
Igor Sysoev6b7cfab2003-01-21 17:36:01 +000020{
Igor Sysoevfcce8d52003-01-23 18:47:54 +000021 int i;
22
23 ngx_timer_hash_size = NGX_TIMER_HASH_SIZE;
24
25 ngx_test_null(ngx_timer_queue,
26 ngx_alloc(ngx_timer_hash_size * sizeof(ngx_event_t), log),
27 NGX_ERROR);
28
29 for (i = 0; i < ngx_timer_hash_size; i++) {
30 ngx_timer_queue[i].timer_prev = &ngx_timer_queue[i];
31 ngx_timer_queue[i].timer_next = &ngx_timer_queue[i];
32 }
33
34 return NGX_OK;
35}
36
37
38void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
39{
40 int n;
Igor Sysoev6b7cfab2003-01-21 17:36:01 +000041 ngx_event_t *e;
42
43#if (NGX_DEBUG_EVENT)
44 ngx_connection_t *c = (ngx_connection_t *) ev->data;
45 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer);
46#endif
47
48 if (ev->timer_next || ev->timer_prev) {
49 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set");
50 return;
51 }
52
53 n = timer % ngx_timer_hash_size;
Igor Sysoev404326f2003-01-24 06:20:47 +000054#if (NGX_DEBUG_EVENT)
55 ngx_log_debug(ev->log, "timer slot: %d" _ n);
56#endif
Igor Sysoev6b7cfab2003-01-21 17:36:01 +000057
Igor Sysoevfcce8d52003-01-23 18:47:54 +000058 for (e = ngx_timer_queue[n].timer_next;
59 e != &ngx_timer_queue[n] && timer > e->timer_delta;
Igor Sysoev6b7cfab2003-01-21 17:36:01 +000060 e = e->timer_next)
61 {
62 timer -= e->timer_delta;
63 }
64
65 ev->timer_delta = timer;
66
67 ev->timer_next = e;
68 ev->timer_prev = e->timer_prev;
69
70 e->timer_prev->timer_next = ev;
71 e->timer_prev = ev;
72}
Igor Sysoev404326f2003-01-24 06:20:47 +000073
74
75void ngx_event_expire_timers(ngx_msec_t timer)
76{
77 int i;
78 ngx_msec_t delta;
79 ngx_event_t *ev;
80
81 for (i = 0; i < ngx_timer_hash_size; i++) {
82
83 delta = timer;
84
85 for ( ;; ) {
86 ev = ngx_timer_queue[i].timer_next;
87
88 if (ev == &ngx_timer_queue[i]) {
89 break;
90 }
91
92 if (ev->timer_delta > delta) {
93 ev->timer_delta -= delta;
94 break;
95 }
96
97 delta -= ev->timer_delta;
98
99 ngx_del_timer(ev);
100 ev->timedout = 1;
101
102 if (ev->event_handler(ev) == NGX_ERROR) {
103 ev->close_handler(ev);
104 }
105 }
106 }
107}