Mercurial > hg > nginx
comparison src/event/modules/ngx_poll_module.c @ 245:e6c005b66b3a
nginx-0.0.1-2004-01-30-00:45:01 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 29 Jan 2004 21:45:01 +0000 |
parents | 1119faf4635a |
children | 6753e8cdaa2c |
comparison
equal
deleted
inserted
replaced
244:187dc0a3197d | 245:e6c005b66b3a |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru | 3 * Copyright (C) 2002-2004 Igor Sysoev, http://sysoev.ru/en/ |
4 */ | 4 */ |
5 | 5 |
6 | 6 |
7 #include <ngx_config.h> | 7 #include <ngx_config.h> |
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
144 #if (NGX_WRITE_EVENT != POLLOUT) | 144 #if (NGX_WRITE_EVENT != POLLOUT) |
145 event = POLLOUT; | 145 event = POLLOUT; |
146 #endif | 146 #endif |
147 } | 147 } |
148 | 148 |
149 #if (NGX_DEBUG_EVENT) | 149 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
150 ngx_log_debug(ev->log, "add event: %d:%d" _ c->fd _ event); | 150 "poll add event: fd:%d ev:%d", c->fd, event); |
151 #endif | |
152 | 151 |
153 if (e == NULL || e->index == NGX_INVALID_INDEX) { | 152 if (e == NULL || e->index == NGX_INVALID_INDEX) { |
154 event_list[nevents].fd = c->fd; | 153 event_list[nevents].fd = c->fd; |
155 event_list[nevents].events = event; | 154 event_list[nevents].events = event; |
156 event_list[nevents].revents = 0; | 155 event_list[nevents].revents = 0; |
190 #if (NGX_WRITE_EVENT != POLLOUT) | 189 #if (NGX_WRITE_EVENT != POLLOUT) |
191 event = POLLOUT; | 190 event = POLLOUT; |
192 #endif | 191 #endif |
193 } | 192 } |
194 | 193 |
195 #if (NGX_DEBUG_EVENT) | 194 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
196 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event); | 195 "poll del event: fd:%d ev:%d", c->fd, event); |
197 #endif | |
198 | 196 |
199 if (e == NULL || e->index == NGX_INVALID_INDEX) { | 197 if (e == NULL || e->index == NGX_INVALID_INDEX) { |
200 if (ev->index < (u_int) --nevents) { | 198 if (ev->index < (u_int) --nevents) { |
201 event_list[ev->index] = event_list[nevents]; | 199 event_list[ev->index] = event_list[nevents]; |
202 event_index[ev->index] = event_index[nevents]; | 200 event_index[ev->index] = event_index[nevents]; |
219 int i, j, ready, nready, found; | 217 int i, j, ready, nready, found; |
220 ngx_msec_t timer; | 218 ngx_msec_t timer; |
221 ngx_err_t err; | 219 ngx_err_t err; |
222 ngx_cycle_t **cycle; | 220 ngx_cycle_t **cycle; |
223 ngx_event_t *ev; | 221 ngx_event_t *ev; |
224 ngx_epoch_msec_t delta; | 222 ngx_epoch_msec_t delta; |
225 ngx_connection_t *c; | 223 ngx_connection_t *c; |
226 struct timeval tv; | 224 struct timeval tv; |
227 | 225 |
228 timer = ngx_event_find_timer(); | 226 timer = ngx_event_find_timer(); |
229 | 227 ngx_old_elapsed_msec = ngx_elapsed_msec; |
230 if (timer) { | 228 |
231 ngx_gettimeofday(&tv); | 229 if (timer == 0) { |
232 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; | |
233 | |
234 } else { | |
235 timer = (ngx_msec_t) INFTIM; | 230 timer = (ngx_msec_t) INFTIM; |
236 delta = 0; | 231 } |
237 } | 232 |
238 | 233 #if (NGX_DEBUG) |
239 #if (NGX_DEBUG_EVENT) | |
240 for (i = 0; i < nevents; i++) { | 234 for (i = 0; i < nevents; i++) { |
241 ngx_log_debug(log, "poll: %d, %d" _ | 235 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, "poll: fd:%d ev:%04X", |
242 event_list[i].fd _ event_list[i].events); | 236 event_list[i].fd, event_list[i].events); |
243 } | 237 } |
244 | 238 |
245 ngx_log_debug(log, "poll timer: %d" _ timer); | 239 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "poll timer: %d", timer); |
246 #endif | 240 #endif |
247 | 241 |
248 ready = poll(event_list, (u_int) nevents, (int) timer); | 242 ready = poll(event_list, (u_int) nevents, (int) timer); |
249 | 243 |
250 if (ready == -1) { | 244 if (ready == -1) { |
251 err = ngx_errno; | 245 err = ngx_errno; |
252 } else { | 246 } else { |
253 err = 0; | 247 err = 0; |
254 } | 248 } |
255 | 249 |
256 ngx_log_debug(log, "poll ready %d" _ ready); | 250 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "poll ready %d", ready); |
257 | 251 |
258 ngx_gettimeofday(&tv); | 252 ngx_gettimeofday(&tv); |
259 ngx_time_update(tv.tv_sec); | 253 ngx_time_update(tv.tv_sec); |
260 | 254 |
255 delta = ngx_elapsed_msec; | |
256 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; | |
257 | |
261 if ((int) timer != INFTIM) { | 258 if ((int) timer != INFTIM) { |
262 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; | 259 delta = ngx_elapsed_msec - delta; |
263 | 260 |
264 #if (NGX_DEBUG_EVENT) | 261 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, |
265 ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta); | 262 "poll timer: %d, delta: %d", timer, (int) delta); |
266 #endif | |
267 ngx_event_expire_timers((ngx_msec_t) delta); | |
268 | |
269 } else { | 263 } else { |
270 if (ready == 0) { | 264 if (ready == 0) { |
271 ngx_log_error(NGX_LOG_ALERT, log, 0, | 265 ngx_log_error(NGX_LOG_ALERT, log, 0, |
272 "poll() returned no events without timeout"); | 266 "poll() returned no events without timeout"); |
273 return NGX_ERROR; | 267 return NGX_ERROR; |
274 } | 268 } |
275 | |
276 #if (NGX_DEBUG_EVENT) | |
277 ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta); | |
278 #endif | |
279 } | 269 } |
280 | 270 |
281 if (err) { | 271 if (err) { |
282 ngx_log_error(NGX_LOG_ALERT, log, err, "poll() failed"); | 272 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
273 log, err, "poll() failed"); | |
283 return NGX_ERROR; | 274 return NGX_ERROR; |
284 } | 275 } |
285 | 276 |
286 nready = 0; | 277 nready = 0; |
287 | 278 |
304 if (c->fd == -1) { | 295 if (c->fd == -1) { |
305 ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle"); | 296 ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle"); |
306 exit(1); | 297 exit(1); |
307 } | 298 } |
308 | 299 |
309 #if (NGX_DEBUG_EVENT) | 300 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, |
310 ngx_log_debug(log, "poll: fd:%d, ev:%d, rev:%d" _ | 301 "poll: fd:%d ev:%04X rev:%04X", |
311 event_list[i].fd _ | 302 event_list[i].fd, |
312 event_list[i].events _ event_list[i].revents); | 303 event_list[i].events, event_list[i].revents); |
313 #endif | |
314 | 304 |
315 found = 0; | 305 found = 0; |
316 | 306 |
317 if (event_list[i].revents & POLLNVAL) { | 307 if (event_list[i].revents & POLLNVAL) { |
318 ngx_log_error(NGX_LOG_ALERT, log, EBADF, | 308 ngx_log_error(NGX_LOG_ALERT, log, EBADF, |
341 continue; | 331 continue; |
342 } | 332 } |
343 | 333 |
344 if (event_list[i].revents & (POLLERR|POLLHUP)) { | 334 if (event_list[i].revents & (POLLERR|POLLHUP)) { |
345 ngx_log_error(NGX_LOG_ALERT, log, 0, | 335 ngx_log_error(NGX_LOG_ALERT, log, 0, |
346 "strange poll() error on %d:%d:%d", | 336 "strange poll() error on fd:%d ev:%04X rev:%04X", |
347 event_list[i].fd, | 337 event_list[i].fd, |
348 event_list[i].events, event_list[i].revents); | 338 event_list[i].events, event_list[i].revents); |
349 } | 339 } |
350 } | 340 } |
351 | 341 |
375 | 365 |
376 if (ready != 0) { | 366 if (ready != 0) { |
377 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); | 367 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); |
378 } | 368 } |
379 | 369 |
370 if (timer != (ngx_msec_t) INFTIM && delta) { | |
371 ngx_event_expire_timers((ngx_msec_t) delta); | |
372 } | |
373 | |
380 return NGX_OK; | 374 return NGX_OK; |
381 } | 375 } |