Mercurial > hg > nginx-ranges
comparison src/event/modules/ngx_devpoll_module.c @ 324:f7cd062ee035 NGINX_0_6_6
nginx 0.6.6
*) Feature: the --sysconfdir=PATH option in configure.
*) Feature: named locations.
*) Feature: the $args variable can be set with the "set" directive.
*) Feature: the $is_args variable.
*) Bugfix: fair big weight upstream balancer.
*) Bugfix: if a client has closed connection to mail proxy then nginx
might not close connection to backend.
*) Bugfix: if the same host without specified port was used as backend
for HTTP and HTTPS, then nginx used only one port - 80 or 443.
*) Bugfix: fix building on Solaris/amd64 by Sun Studio 11 and early
versions; bug appeared in 0.6.4.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 30 Jul 2007 00:00:00 +0400 |
parents | 92402f034b28 |
children | 3a91bfeffaba |
comparison
equal
deleted
inserted
replaced
323:7e977a664d91 | 324:f7cd062ee035 |
---|---|
11 | 11 |
12 #if (NGX_TEST_BUILD_DEVPOLL) | 12 #if (NGX_TEST_BUILD_DEVPOLL) |
13 | 13 |
14 /* Solaris declarations */ | 14 /* Solaris declarations */ |
15 | 15 |
16 #define POLLREMOVE 0x0800 | 16 #define POLLREMOVE 0x0800 |
17 #define DP_POLL 0xD001 | 17 #define DP_POLL 0xD001 |
18 | 18 |
19 struct dvpoll { | 19 struct dvpoll { |
20 struct pollfd *dp_fds; | 20 struct pollfd *dp_fds; |
21 int dp_nfds; | 21 int dp_nfds; |
22 int dp_timeout; | 22 int dp_timeout; |
24 | 24 |
25 #endif | 25 #endif |
26 | 26 |
27 | 27 |
28 typedef struct { | 28 typedef struct { |
29 u_int changes; | 29 ngx_uint_t changes; |
30 u_int events; | 30 ngx_uint_t events; |
31 } ngx_devpoll_conf_t; | 31 } ngx_devpoll_conf_t; |
32 | 32 |
33 | 33 |
34 static ngx_int_t ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer); | 34 static ngx_int_t ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer); |
35 static void ngx_devpoll_done(ngx_cycle_t *cycle); | 35 static void ngx_devpoll_done(ngx_cycle_t *cycle); |
36 static ngx_int_t ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags); | 36 static ngx_int_t ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, |
37 static ngx_int_t ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags); | 37 ngx_uint_t flags); |
38 static ngx_int_t ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags); | 38 static ngx_int_t ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, |
39 ngx_uint_t flags); | |
40 static ngx_int_t ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, | |
41 ngx_uint_t flags); | |
39 static ngx_int_t ngx_devpoll_process_events(ngx_cycle_t *cycle, | 42 static ngx_int_t ngx_devpoll_process_events(ngx_cycle_t *cycle, |
40 ngx_msec_t timer, ngx_uint_t flags); | 43 ngx_msec_t timer, ngx_uint_t flags); |
41 | 44 |
42 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle); | 45 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle); |
43 static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf); | 46 static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf); |
44 | 47 |
45 static int dp = -1; | 48 static int dp = -1; |
46 static struct pollfd *change_list, *event_list; | 49 static struct pollfd *change_list, *event_list; |
47 static u_int nchanges, max_changes, nevents; | 50 static ngx_uint_t nchanges, max_changes, nevents; |
48 | 51 |
49 static ngx_event_t **change_index; | 52 static ngx_event_t **change_index; |
50 | 53 |
51 | 54 |
52 static ngx_str_t devpoll_name = ngx_string("/dev/poll"); | 55 static ngx_str_t devpoll_name = ngx_string("/dev/poll"); |
206 nevents = 0; | 209 nevents = 0; |
207 } | 210 } |
208 | 211 |
209 | 212 |
210 static ngx_int_t | 213 static ngx_int_t |
211 ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags) | 214 ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) |
212 { | 215 { |
213 #if (NGX_DEBUG) | 216 #if (NGX_DEBUG) |
214 ngx_connection_t *c; | 217 ngx_connection_t *c; |
215 #endif | 218 #endif |
216 | 219 |
219 #endif | 222 #endif |
220 | 223 |
221 #if (NGX_DEBUG) | 224 #if (NGX_DEBUG) |
222 c = ev->data; | 225 c = ev->data; |
223 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 226 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
224 "devpoll add event: fd:%d ev:%04Xd", c->fd, event); | 227 "devpoll add event: fd:%d ev:%04Xi", c->fd, event); |
225 #endif | 228 #endif |
226 | 229 |
227 ev->active = 1; | 230 ev->active = 1; |
228 | 231 |
229 return ngx_devpoll_set_event(ev, event, 0); | 232 return ngx_devpoll_set_event(ev, event, 0); |
230 } | 233 } |
231 | 234 |
232 | 235 |
233 static ngx_int_t | 236 static ngx_int_t |
234 ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags) | 237 ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) |
235 { | 238 { |
236 ngx_event_t *e; | 239 ngx_event_t *e; |
237 ngx_connection_t *c; | 240 ngx_connection_t *c; |
238 | 241 |
239 c = ev->data; | 242 c = ev->data; |
241 #if (NGX_READ_EVENT != POLLIN) | 244 #if (NGX_READ_EVENT != POLLIN) |
242 event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT; | 245 event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT; |
243 #endif | 246 #endif |
244 | 247 |
245 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 248 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
246 "devpoll del event: fd:%d ev:%04Xd", c->fd, event); | 249 "devpoll del event: fd:%d ev:%04Xi", c->fd, event); |
247 | 250 |
248 if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) { | 251 if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) { |
249 return NGX_ERROR; | 252 return NGX_ERROR; |
250 } | 253 } |
251 | 254 |
273 return NGX_OK; | 276 return NGX_OK; |
274 } | 277 } |
275 | 278 |
276 | 279 |
277 static ngx_int_t | 280 static ngx_int_t |
278 ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags) | 281 ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) |
279 { | 282 { |
280 size_t n; | 283 size_t n; |
281 ngx_connection_t *c; | 284 ngx_connection_t *c; |
282 | 285 |
283 c = ev->data; | 286 c = ev->data; |
284 | 287 |
285 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 288 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
286 "devpoll fd:%d ev:%04Xd fl:%04Xd", c->fd, event, flags); | 289 "devpoll fd:%d ev:%04Xi fl:%04Xi", c->fd, event, flags); |
287 | 290 |
288 if (nchanges >= max_changes) { | 291 if (nchanges >= max_changes) { |
289 ngx_log_error(NGX_LOG_WARN, ev->log, 0, | 292 ngx_log_error(NGX_LOG_WARN, ev->log, 0, |
290 "/dev/pool change list is filled up"); | 293 "/dev/pool change list is filled up"); |
291 | 294 |
298 | 301 |
299 nchanges = 0; | 302 nchanges = 0; |
300 } | 303 } |
301 | 304 |
302 change_list[nchanges].fd = c->fd; | 305 change_list[nchanges].fd = c->fd; |
303 change_list[nchanges].events = event; | 306 change_list[nchanges].events = (short) event; |
304 change_list[nchanges].revents = 0; | 307 change_list[nchanges].revents = 0; |
305 | 308 |
306 change_index[nchanges] = ev; | 309 change_index[nchanges] = ev; |
307 ev->index = nchanges; | 310 ev->index = nchanges; |
308 | 311 |
351 | 354 |
352 nchanges = 0; | 355 nchanges = 0; |
353 } | 356 } |
354 | 357 |
355 dvp.dp_fds = event_list; | 358 dvp.dp_fds = event_list; |
356 dvp.dp_nfds = nevents; | 359 dvp.dp_nfds = (int) nevents; |
357 dvp.dp_timeout = timer; | 360 dvp.dp_timeout = timer; |
358 events = ioctl(dp, DP_POLL, &dvp); | 361 events = ioctl(dp, DP_POLL, &dvp); |
359 | 362 |
360 if (events == -1) { | 363 if (events == -1) { |
361 err = ngx_errno; | 364 err = ngx_errno; |