summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2002-08-15 17:20:26 +0000
committerIgor Sysoev <igor@sysoev.ru>2002-08-15 17:20:26 +0000
commit0c331d9f666b4f9be91009b7caea457e58a80779 (patch)
treed48221581b361ee5b0ccad46e4df49caa41b1bba /src/event
parent6de5c2cb63f8aee4bcbec3c363a72fd8e4a4e64d (diff)
downloadnginx-0c331d9f666b4f9be91009b7caea457e58a80779.tar.gz
nginx-0c331d9f666b4f9be91009b7caea457e58a80779.tar.bz2
nginx-0.0.1-2002-08-15-21:20:26 import
Diffstat (limited to 'src/event')
-rw-r--r--src/event/modules/ngx_overlapped_module.c34
-rw-r--r--src/event/ngx_event.h22
-rw-r--r--src/event/ngx_event_mutex.c14
-rw-r--r--src/event/ngx_event_recv.c (renamed from src/event/ngx_event_read.c)19
-rw-r--r--src/event/ngx_event_write.c57
5 files changed, 99 insertions, 47 deletions
diff --git a/src/event/modules/ngx_overlapped_module.c b/src/event/modules/ngx_overlapped_module.c
index 2bb4d7f69..c3af39dce 100644
--- a/src/event/modules/ngx_overlapped_module.c
+++ b/src/event/modules/ngx_overlapped_module.c
@@ -1,17 +1,41 @@
+
+ event = WSACreateEvent(void);
+ WSAEventSelect(s, event, FD_ACCEPT);
+
+
int ngx_overlapped_process_events(ngx_log_t *log)
{
if (acceptex)
- event = SleepEx(timer, 1);
+ n = SleepEx(timer, 1);
else
- event = WSAWaitForMultipleEvents(n_events, events, 0, timer, 1);
+ n = WSAWaitForMultipleEvents(nevents, events, 0, timer, 1);
+
+ if (n == WSA_WAIT_TIMEOUT)
+ close some event;
+
+ if (n == WSA_IO_COMPLETION)
+ again
+
+ /* try it with AcceptEx() on NT to detect connected sockets */
+ if (!acceptex) {
+ WSAEnumNetworkEvents(
+ sockets[n - WSA_WAIT_EVENT_0],
+ events[n - WSA_WAIT_EVENT_0],
+ net_events);
+
+ if (net_events.lNetworkEvents & FD_ACCEPT) {
+ if (net_events.iErrorCode[FD_ACCEPT_BIT] != 0)
+ accept error
+ again
- if (event == WSA_IO_COMPLETION)
- look ready array
+ ngx_event_accept(); OR post AcceptEx();
+ }
+ }
}
void CALLBACK overlapped_completion_procedure(DWORD error, DWORD nbytes,
LPWSAOVERLAPPED overlapped, DWORD flags)
{
- push overlapped;
+ run event handler
}
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 7087e6950..9f758d33a 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -16,8 +16,8 @@ struct ngx_event_s {
void *context;
char *action;
- ngx_event_t *prev; /* queue in select(), poll() */
- ngx_event_t *next;
+ ngx_event_t *prev; /* queue in select(), poll(), mutex(), */
+ ngx_event_t *next; /* aio_read(), aio_write() */
int (*timer_handler)(ngx_event_t *ev);
ngx_event_t *timer_prev;
@@ -52,7 +52,7 @@ struct ngx_event_s {
#endif
#if (HAVE_KQUEUE)
unsigned eof:1;
- int errno;
+ int error;
#endif
};
@@ -70,12 +70,20 @@ typedef struct {
int (*add)(ngx_event_t *ev, int event, u_int flags);
int (*del)(ngx_event_t *ev, int event);
int (*process)(ngx_log_t *log);
-/*
int (*read)(ngx_event_t *ev, char *buf, size_t size);
+/*
int (*write)(ngx_event_t *ev, char *buf, size_t size);
*/
} ngx_event_actions_t;
+/*
+
+NGX_LEVEL_EVENT (default) select, poll, kqueue
+ requires to read whole data
+NGX_ONESHOT_EVENT kqueue
+NGX_CLEAR_EVENT kqueue
+
+*/
#if (HAVE_KQUEUE)
@@ -99,15 +107,21 @@ typedef struct {
#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
+#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_event_recv ngx_event_recv_core
+
#endif
diff --git a/src/event/ngx_event_mutex.c b/src/event/ngx_event_mutex.c
new file mode 100644
index 000000000..5a9542b06
--- /dev/null
+++ b/src/event/ngx_event_mutex.c
@@ -0,0 +1,14 @@
+
+spinlock_max depend on CPU number and mutex type.
+ 1 CPU 1
+ ngx_malloc_mutex 1000 ?
+
+
+int ngx_event_mutex_trylock(ngx_mutex_t *mtx)
+{
+ for(i = mtx->spinlock_max; i; i--)
+ if (trylock(mtx->lock))
+ return 1;
+
+ return 0;
+}
diff --git a/src/event/ngx_event_read.c b/src/event/ngx_event_recv.c
index b08e5107e..75afcb854 100644
--- a/src/event/ngx_event_read.c
+++ b/src/event/ngx_event_recv.c
@@ -2,23 +2,28 @@
#include <ngx_config.h>
#include <ngx_errno.h>
#include <ngx_log.h>
+#include <ngx_recv.h>
#include <ngx_connection.h>
-int ngx_event_recv(ngx_connection_t *c, char *buf, size_t size)
+int ngx_event_recv_core(ngx_event_t *ev, char *buf, size_t size)
{
- int n;
- ngx_err_t err;
- ngx_event_t *ev = c->read;
+ int n;
+ ngx_err_t err;
+ ngx_connection_t *c;
+
+ c = (ngx_connection_t *) ev->data;
#if (HAVE_KQUEUE)
+ ngx_log_debug(ev->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _
+ ev->eof _ ev->available _ ev->error);
#if !(USE_KQUEUE)
if (ngx_event_type == NGX_KQUEUE_EVENT)
#endif
if (ev->eof && ev->available == 0) {
if (ev->error) {
ngx_log_error(NGX_LOG_ERR, ev->log, ev->error,
- "ngx_event_recv: recv failed while %s",
- ev->log->action);
+ "ngx_event_recv: recv failed while %s",
+ ev->log->action);
return -1;
}
@@ -27,7 +32,7 @@ int ngx_event_recv(ngx_connection_t *c, char *buf, size_t size)
}
#endif
- n = recv(c->fd, buf, size, 0);
+ n = ngx_recv(c->fd, buf, size, 0);
if (n == -1) {
err = ngx_socket_errno;
diff --git a/src/event/ngx_event_write.c b/src/event/ngx_event_write.c
index 0a9a482d9..965a87c99 100644
--- a/src/event/ngx_event_write.c
+++ b/src/event/ngx_event_write.c
@@ -10,8 +10,8 @@
#include <ngx_event_write.h>
-ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in,
- off_t flush)
+ngx_chain_t *ngx_event_write(ngx_connection_t *cn, ngx_chain_t *in,
+ off_t flush)
{
int rc;
char *last;
@@ -34,25 +34,21 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in,
header->nelts = 0;
trailer->nelts = 0;
- if (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)) {
+ if (ch->hunk->type & NGX_HUNK_IN_MEMORY) {
last = NULL;
iov = NULL;
- while (ch
- && (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)))
+ while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY))
{
- if (ch->hunk->type & NGX_HUNK_FLUSH)
- continue;
-
- if (last == ch->hunk->pos.p) {
- iov->ngx_iov_len += ch->hunk->last.p - ch->hunk->pos.p;
+ if (last == ch->hunk->pos.mem) {
+ iov->ngx_iov_len += ch->hunk->last.mem - ch->hunk->pos.mem;
} else {
ngx_test_null(iov, ngx_push_array(header),
(ngx_chain_t *) -1);
- iov->ngx_iov_base = ch->hunk->pos.p;
- iov->ngx_iov_len = ch->hunk->last.p - ch->hunk->pos.p;
- last = ch->hunk->last.p;
+ iov->ngx_iov_base = ch->hunk->pos.mem;
+ iov->ngx_iov_len = ch->hunk->last.mem - ch->hunk->pos.mem;
+ last = ch->hunk->last.mem;
}
ch = ch->next;
@@ -70,25 +66,23 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in,
&sent);
} else {
#endif
- if (ch && ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)) {
+ if (ch && ch->hunk->type & NGX_HUNK_IN_MEMORY) {
last = NULL;
iov = NULL;
- while (ch
- && (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)))
- {
- if (ch->hunk->type & NGX_HUNK_FLUSH)
- continue;
+ while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY)) {
- if (last == ch->hunk->pos.p) {
- iov->ngx_iov_len += ch->hunk->last.p - ch->hunk->pos.p;
+ if (last == ch->hunk->pos.mem) {
+ iov->ngx_iov_len +=
+ ch->hunk->last.mem - ch->hunk->pos.mem;
} else {
ngx_test_null(iov, ngx_push_array(trailer),
(ngx_chain_t *) -1);
- iov->ngx_iov_base = ch->hunk->pos.p;
- iov->ngx_iov_len = ch->hunk->last.p - ch->hunk->pos.p;
- last = ch->hunk->last.p;
+ iov->ngx_iov_base = ch->hunk->pos.mem;
+ iov->ngx_iov_len =
+ ch->hunk->last.mem - ch->hunk->pos.mem;
+ last = ch->hunk->last.mem;
}
ch = ch->next;
@@ -98,8 +92,8 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in,
if (file) {
rc = ngx_sendfile(cn->fd,
(ngx_iovec_t *) header->elts, header->nelts,
- file->fd, file->pos.f,
- (size_t) (file->last.f - file->pos.f),
+ file->fd, file->pos.file,
+ (size_t) (file->last.file - file->pos.file),
(ngx_iovec_t *) trailer->elts, trailer->nelts,
&sent, cn->log);
} else {
@@ -117,17 +111,18 @@ ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in,
flush -= sent;
for (ch = in; ch && !(ch->hunk->type & NGX_HUNK_LAST); ch = ch->next) {
- if (sent >= ch->hunk->last.f - ch->hunk->pos.f) {
- sent -= ch->hunk->last.f - ch->hunk->pos.f;
- ch->hunk->last.f = ch->hunk->pos.f;
+ if (sent >= ch->hunk->last.file - ch->hunk->pos.file) {
+ sent -= ch->hunk->last.file - ch->hunk->pos.file;
+ ch->hunk->last.file = ch->hunk->pos.file;
continue;
}
- ch->hunk->pos.f += sent;
+ ch->hunk->pos.file += sent;
break;
}
- } while (flush > 0);
+ /* flush hunks if threaded state */
+ } while (cn->write->context && flush > 0);
ngx_destroy_array(trailer);
ngx_destroy_array(header);