Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 12:055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 13 Sep 2002 14:47:42 +0000 |
parents | f323b4f74e4a |
children | f8a0d0f31a24 |
comparison
equal
deleted
inserted
replaced
11:f323b4f74e4a | 12:055ed05235ae |
---|---|
32 int size = sizeof(struct kevent) * 512; | 32 int size = sizeof(struct kevent) * 512; |
33 | 33 |
34 nchanges = 0; | 34 nchanges = 0; |
35 nevents = 512; | 35 nevents = 512; |
36 | 36 |
37 if ((kq = kqueue()) == -1) { | 37 kq = kqueue(); |
38 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, | 38 |
39 "kqueue() failed"); | 39 if (kq == -1) { |
40 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); | |
40 exit(1); | 41 exit(1); |
41 } | 42 } |
42 | 43 |
43 change_list = ngx_alloc(size, log); | 44 change_list = ngx_alloc(size, log); |
44 event_list = ngx_alloc(size, log); | 45 event_list = ngx_alloc(size, log); |
50 ngx_event_actions.add = ngx_kqueue_add_event; | 51 ngx_event_actions.add = ngx_kqueue_add_event; |
51 ngx_event_actions.del = ngx_kqueue_del_event; | 52 ngx_event_actions.del = ngx_kqueue_del_event; |
52 ngx_event_actions.timer = ngx_kqueue_add_timer; | 53 ngx_event_actions.timer = ngx_kqueue_add_timer; |
53 ngx_event_actions.process = ngx_kqueue_process_events; | 54 ngx_event_actions.process = ngx_kqueue_process_events; |
54 #endif | 55 #endif |
55 | |
56 } | 56 } |
57 | 57 |
58 int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) | 58 int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) |
59 { | 59 { |
60 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; | 60 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; |
70 int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) | 70 int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) |
71 { | 71 { |
72 struct timespec ts = { 0, 0 }; | 72 struct timespec ts = { 0, 0 }; |
73 ngx_connection_t *cn = (ngx_connection_t *) ev->data; | 73 ngx_connection_t *cn = (ngx_connection_t *) ev->data; |
74 | 74 |
75 ngx_log_debug(ev->log, "ngx_kqueue_set_event: %d: ft:%d f:%08x" _ | 75 ngx_log_debug(ev->log, "kqueue set event: %d: ft:%d f:%08x" _ |
76 cn->fd _ filter _ flags); | 76 cn->fd _ filter _ flags); |
77 | 77 |
78 if (nchanges >= nevents) { | 78 if (nchanges >= nevents) { |
79 ngx_log_error(NGX_LOG_WARN, ev->log, 0, | 79 ngx_log_error(NGX_LOG_WARN, ev->log, 0, |
80 "ngx_kqueue_set_event: change list is filled up"); | 80 "ngx_kqueue_set_event: change list is filled up"); |
81 | 81 |
82 if (kevent(kq, change_list, nchanges, NULL, 0, &ts) == -1) { | 82 if (kevent(kq, change_list, nchanges, NULL, 0, &ts) == -1) { |
83 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, | 83 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent failed"); |
84 "ngx_kqueue_set_event: kevent failed"); | 84 return NGX_ERROR; |
85 return -1; | |
86 } | 85 } |
87 nchanges = 0; | 86 nchanges = 0; |
88 } | 87 } |
89 | 88 |
90 change_list[nchanges].ident = cn->fd; | 89 change_list[nchanges].ident = cn->fd; |
93 change_list[nchanges].fflags = 0; | 92 change_list[nchanges].fflags = 0; |
94 change_list[nchanges].data = 0; | 93 change_list[nchanges].data = 0; |
95 change_list[nchanges].udata = ev; | 94 change_list[nchanges].udata = ev; |
96 nchanges++; | 95 nchanges++; |
97 | 96 |
98 return 0; | 97 return NGX_OK; |
99 } | 98 } |
100 | 99 |
101 int ngx_kqueue_process_events(ngx_log_t *log) | 100 int ngx_kqueue_process_events(ngx_log_t *log) |
102 { | 101 { |
103 int events, i; | 102 int events, i; |
113 tp = &ts; | 112 tp = &ts; |
114 gettimeofday(&tv, NULL); | 113 gettimeofday(&tv, NULL); |
115 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; | 114 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; |
116 } | 115 } |
117 | 116 |
118 ngx_log_debug(log, "ngx_kqueue_process_events: timer: %d" _ timer); | 117 ngx_log_debug(log, "kevent timer: %d" _ timer); |
119 | 118 |
120 if ((events = kevent(kq, change_list, nchanges, event_list, nevents, tp)) | 119 events = kevent(kq, change_list, nchanges, event_list, nevents, tp); |
121 == -1) { | 120 if (events == -1) { |
122 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | 121 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent failed"); |
123 "ngx_kqueue_process_events: kevent failed"); | 122 return NGX_ERROR; |
124 return -1; | |
125 } | 123 } |
126 | 124 |
127 nchanges = 0; | 125 nchanges = 0; |
128 | 126 |
129 if (timer) { | 127 if (timer) { |
130 gettimeofday(&tv, NULL); | 128 gettimeofday(&tv, NULL); |
131 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; | 129 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; |
132 | 130 |
133 } else { | 131 } else { |
134 ngx_assert((events != 0), return -1, log, | 132 ngx_assert((events != 0), return NGX_ERROR, log, |
135 "ngx_kqueue_process_events: " | |
136 "kevent returns no events without timeout"); | 133 "kevent returns no events without timeout"); |
137 } | 134 } |
138 | 135 |
139 ngx_log_debug(log, "ngx_kqueue_process_events: " | 136 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta); |
140 "timer: %d, delta: %d" _ timer _ delta); | |
141 | 137 |
142 if (timer) { | 138 if (timer) { |
143 if (delta >= timer) { | 139 if (delta >= timer) { |
144 for (ev = timer_queue.timer_next; | 140 for (ev = timer_queue.timer_next; |
145 ev != &timer_queue && delta >= ev->timer_delta; | 141 ev != &timer_queue && delta >= ev->timer_delta; |
159 } | 155 } |
160 } | 156 } |
161 | 157 |
162 for (i = 0; i < events; i++) { | 158 for (i = 0; i < events; i++) { |
163 | 159 |
164 ngx_log_debug(log, "ngx_kqueue_process_events: kevent: " | 160 ngx_log_debug(log, "kevent: %d: ft:%d f:%08x ff:%08x d:%d ud:%08x" _ |
165 "%d: ft:%d f:%08x ff:%08x d:%d ud:%08x" _ | |
166 event_list[i].ident _ event_list[i].filter _ | 161 event_list[i].ident _ event_list[i].filter _ |
167 event_list[i].flags _ event_list[i].fflags _ | 162 event_list[i].flags _ event_list[i].fflags _ |
168 event_list[i].data _ event_list[i].udata); | 163 event_list[i].data _ event_list[i].udata); |
169 | 164 |
170 if (event_list[i].flags & EV_ERROR) { | 165 if (event_list[i].flags & EV_ERROR) { |
171 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, | 166 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, |
172 "ngx_kqueue_process_events: kevent error on %d", | 167 "kevent error on %d", event_list[i].ident); |
173 event_list[i].ident); | |
174 continue; | 168 continue; |
175 } | 169 } |
176 | 170 |
177 ev = (ngx_event_t *) event_list[i].udata; | 171 ev = (ngx_event_t *) event_list[i].udata; |
178 | 172 |
196 | 190 |
197 break; | 191 break; |
198 | 192 |
199 default: | 193 default: |
200 ngx_assert(0, /* void */, log, | 194 ngx_assert(0, /* void */, log, |
201 "ngx_kqueue_process_events: unknown filter %d" _ | 195 "unknown kevent filter %d" _ event_list[i].filter); |
202 event_list[i].filter); | 196 } |
203 } | 197 } |
204 } | 198 |
205 | 199 return NGX_OK; |
206 return 0; | |
207 } | 200 } |
208 | 201 |
209 void ngx_kqueue_add_timer(ngx_event_t *ev, ngx_msec_t timer) | 202 void ngx_kqueue_add_timer(ngx_event_t *ev, ngx_msec_t timer) |
210 { | 203 { |
211 ngx_event_t *e; | 204 ngx_event_t *e; |