nginx-0.0.1-2003-10-28-18:45:41 import
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 2c743fc..61c724f 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -422,8 +422,8 @@
ev->available = event_list[i].data;
if (event_list[i].flags & EV_EOF) {
- ev->eof = 1;
- ev->error = event_list[i].fflags;
+ ev->kq_eof = 1;
+ ev->kq_errno = event_list[i].fflags;
}
if (ev->oneshot && ev->timer_set) {
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 643ea2b..f070207 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -29,8 +29,9 @@
unsigned int index;
- ngx_event_t *prev; /* queue in mutex(), aio_read(), aio_write() */
- ngx_event_t *next; /* */
+ /* queue in mutex(), aio_read(), aio_write() */
+ ngx_event_t *prev;
+ ngx_event_t *next;
ngx_event_t *timer_prev;
ngx_event_t *timer_next;
@@ -40,22 +41,22 @@
ngx_log_t *log;
- int available; /* kqueue only: */
- /* accept: number of sockets that wait */
- /* to be accepted */
- /* read: bytes to read */
- /* write: available space in buffer */
- /* otherwise: */
- /* accept: 1 if accept many, 0 otherwise */
+ /*
+ * kqueue only:
+ * accept: number of sockets that wait to be accepted
+ * read: bytes to read
+ * write: available space in buffer
+ *
+ * otherwise:
+ * accept: 1 if accept many, 0 otherwise
+ */
+ int available;
unsigned oneshot:1;
-#if 0
- unsigned listening:1;
-#endif
unsigned write:1;
- /* used to detect stale events in kqueue, rt signals and epoll */
+ /* used to detect the stale events in kqueue, rt signals and epoll */
unsigned instance:1;
/*
@@ -67,12 +68,12 @@
/* ready event; the complete aio operation */
unsigned ready:1;
+ unsigned eof:1;
+ unsigned error:1;
+
unsigned timedout:1;
unsigned timer_set:1;
-#if 1
- unsigned blocked:1;
-#endif
unsigned delayed:1;
unsigned read_discarded:1;
@@ -87,8 +88,8 @@
#endif
#if (HAVE_KQUEUE)
- unsigned eof:1;
- int error;
+ unsigned kq_eof:1;
+ int kq_errno;
#endif
#if (HAVE_LOWAT_EVENT) /* kqueue's NOTE_LOWAT */
@@ -108,41 +109,27 @@
#if 0
- void *thr_ctx; /* event thread context if $(CC) doesn't
- understand __thread declaration
- and pthread_getspecific() is too costly */
+
+ /* the threads support */
+
+ /*
+ * the event thread context, we store it here
+ * if $(CC) does not understand __thread declaration
+ * and pthread_getspecific() is too costly
+ */
+
+ void *thr_ctx;
#if (NGX_EVENT_T_PADDING)
- int padding[NGX_EVENT_T_PADDING]; /* event should not cross
- cache line in SMP */
+
+ /* event should not cross cache line in SMP */
+
+ int padding[NGX_EVENT_T_PADDING];
#endif
#endif
};
-#if 1
-typedef enum {
- NGX_SELECT_EVENT_N = 0,
-#if (HAVE_POLL)
- NGX_POLL_EVENT_N,
-#endif
-#if (HAVE_DEVPOLL)
- NGX_DEVPOLL_EVENT_N,
-#endif
-#if (HAVE_KQUEUE)
- NGX_KQUEUE_EVENT_N,
-#endif
-#if (HAVE_AIO)
- NGX_AIO_EVENT_N,
-#endif
-#if (HAVE_IOCP)
- NGX_IOCP_EVENT_N,
-#endif
- NGX_DUMMY_EVENT_N /* avoid comma at end of enumerator list */
-} ngx_event_type_e ;
-#endif
-
-
typedef struct {
int (*add)(ngx_event_t *ev, int event, u_int flags);
int (*del)(ngx_event_t *ev, int event, u_int flags);
@@ -159,6 +146,9 @@
} ngx_event_actions_t;
+extern ngx_event_actions_t ngx_event_actions;
+
+
/*
* The event filter requires to read/write the whole data -
* select, poll, /dev/poll, kqueue.
@@ -243,12 +233,8 @@
#define NGX_ONESHOT_EVENT EV_ONESHOT
#define NGX_CLEAR_EVENT EV_CLEAR
-#ifndef HAVE_CLEAR_EVENT
-#define HAVE_CLEAR_EVENT 1
-#endif
-
-#elif (HAVE_POLL) || (HAVE_DEVPOLL)
+#elif (HAVE_POLL)
#define NGX_READ_EVENT POLLIN
#define NGX_WRITE_EVENT POLLOUT
@@ -256,7 +242,16 @@
#define NGX_LEVEL_EVENT 0
#define NGX_ONESHOT_EVENT 1
-#else
+
+#elif (HAVE_DEVPOLL)
+
+#define NGX_READ_EVENT POLLIN
+#define NGX_WRITE_EVENT POLLOUT
+
+#define NGX_LEVEL_EVENT 0
+
+
+#else /* select */
#define NGX_READ_EVENT 0
#define NGX_WRITE_EVENT 1
@@ -266,84 +261,35 @@
#endif /* HAVE_KQUEUE */
-#ifndef NGX_CLEAR_EVENT
-#define NGX_CLEAR_EVENT 0 /* dummy */
-#endif
-
-#if (USE_KQUEUE)
-
-#define ngx_init_events ngx_kqueue_init
-#define ngx_process_events ngx_kqueue_process_events
-#define ngx_add_event ngx_kqueue_add_event
-#define ngx_del_event ngx_kqueue_del_event
-#if 0
-#define ngx_add_timer ngx_kqueue_add_timer
-#else
-#define ngx_add_timer ngx_event_add_timer
-#endif
-#define ngx_event_recv ngx_event_recv_core
-
-#else
-
-#define ngx_init_events (ngx_event_init[ngx_event_type])
-#define ngx_process_events ngx_event_actions.process
-#define ngx_add_event ngx_event_actions.add
-#define ngx_del_event ngx_event_actions.del
-#define ngx_add_conn ngx_event_actions.add_conn
-#define ngx_del_conn ngx_event_actions.del_conn
-
-#if 0
-#if (HAVE_IOCP_EVENT)
-#define ngx_event_recv ngx_event_wsarecv
-#elif (HAVE_AIO_EVENT)
-#define ngx_event_recv ngx_event_aio_read
-#else
-#define ngx_event_recv ngx_io.recv
-#define ngx_write_chain ngx_io.send_chain
-#endif
-#endif
-
-#endif
-
-
-
-
-
-/* ***************************** */
-
-#define ngx_recv ngx_io.recv
-#define ngx_recv_chain ngx_io.recv_chain
-#define ngx_write_chain ngx_io.send_chain
-
-
-#define ngx_add_timer ngx_event_add_timer
-#define ngx_del_timer ngx_event_del_timer
-
#if (HAVE_IOCP_EVENT)
#define NGX_IOCP_ACCEPT 0
#define NGX_IOCP_IO 1
#endif
-/* ***************************** */
-
-
-
-
-
-#if !(USE_KQUEUE)
-extern ngx_event_actions_t ngx_event_actions;
-extern ngx_event_type_e ngx_event_type;
-extern int ngx_event_flags;
+#ifndef NGX_CLEAR_EVENT
+#define NGX_CLEAR_EVENT 0 /* dummy declaration */
#endif
+#define ngx_process_events ngx_event_actions.process
+#define ngx_add_event ngx_event_actions.add
+#define ngx_del_event ngx_event_actions.del
+#define ngx_add_conn ngx_event_actions.add_conn
+#define ngx_del_conn ngx_event_actions.del_conn
-/* ***************************** */
+#define ngx_add_timer ngx_event_add_timer
+#define ngx_del_timer ngx_event_del_timer
+
+
+#define ngx_recv ngx_io.recv
+#define ngx_recv_chain ngx_io.recv_chain
+#define ngx_write_chain ngx_io.send_chain
+
+
#define NGX_EVENT_MODULE 0x544E5645 /* "EVNT" */
-
#define NGX_EVENT_CONF 0x00200000
@@ -364,8 +310,10 @@
} ngx_event_module_t;
-extern ngx_module_t ngx_events_module;
-extern ngx_module_t ngx_event_core_module;
+
+extern int ngx_event_flags;
+extern ngx_module_t ngx_events_module;
+extern ngx_module_t ngx_event_core_module;
#define ngx_event_get_conf(conf_ctx, module) \
@@ -380,24 +328,10 @@
int ngx_event_post_acceptex(ngx_listening_t *ls, int n);
#endif
-/* ***************************** */
-
-
-
-
-
-ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size);
-int ngx_event_close_connection(ngx_event_t *ev);
-
-
-int ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log);
-void ngx_worker(ngx_cycle_t *cycle);
-
-
-/* ***************************** */
#include <ngx_event_timer.h>
+
#if (WIN32)
#include <ngx_iocp_module.h>
#endif
@@ -437,8 +371,9 @@
return NGX_OK;
}
- if (rev->active && rev->ready) {
- if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
+ if (rev->active && (rev->ready || rev->eof)) {
+ if (ngx_del_event(rev, NGX_READ_EVENT, rev->eof ? NGX_CLOSE_EVENT : 0)
+ == NGX_ERROR) {
return NGX_ERROR;
}
@@ -551,7 +486,4 @@
}
-/* ***************************** */
-
-
#endif /* _NGX_EVENT_H_INCLUDED_ */
diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c
index c64793d..209f5cf 100644
--- a/src/event/ngx_event_pipe.c
+++ b/src/event/ngx_event_pipe.c
@@ -98,20 +98,46 @@
if (ngx_event_flags == NGX_HAVE_KQUEUE_EVENT) {
- if (p->upstream->read->error) {
- ngx_log_error(NGX_LOG_ERR, p->log, p->upstream->read->error,
+ if (p->upstream->read->available == 0) {
+ if (p->upstream->read->kq_eof) {
+ p->upstream->read->ready = 0;
+ p->upstream->read->eof = 0;
+ p->upstream_eof = 1;
+ p->read = 1;
+
+ if (p->upstream->read->kq_errno) {
+ p->upstream->read->error = 1;
+ p->upstream_error = 1;
+ p->upstream_eof = 0;
+
+ ngx_log_error(NGX_LOG_ERR, p->log,
+ p->upstream->read->kq_errno,
+ /* TODO: ngx_readv_chain_n */
+ "readv() failed");
+ }
+
+ break;
+ }
+ }
+
+#if 0
+ if (p->upstream->read->kq_errno) {
+ ngx_log_error(NGX_LOG_ERR, p->log,
+ p->upstream->read->kq_errno,
"readv() failed");
p->upstream_error = 1;
break;
- } else if (p->upstream->read->eof
+ } else if (p->upstream->read->kq_eof
&& p->upstream->read->available == 0) {
p->upstream_eof = 1;
p->read = 1;
break;
}
+#endif
+
}
#endif