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;