Mercurial > hg > nginx
changeset 372:c9fdfccebc49
nginx-0.0.7-2004-06-29-01:03:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 28 Jun 2004 21:03:14 +0000 |
parents | 780e93985b93 |
children | 018569a8f09c |
files | src/event/modules/ngx_kqueue_module.c src/event/ngx_event_posted.c src/event/ngx_event_posted.h src/event/ngx_event_timer.c src/http/ngx_http_request.c src/os/unix/ngx_freebsd_rfork_thread.c src/os/unix/ngx_thread.h |
diffstat | 7 files changed, 76 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/src/event/modules/ngx_kqueue_module.c Mon Jun 28 16:05:02 2004 +0000 +++ b/src/event/modules/ngx_kqueue_module.c Mon Jun 28 21:03:14 2004 +0000 @@ -193,7 +193,8 @@ ev->disabled = 0; ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; - if (nchanges > 0 + if (ngx_thread_main() + && nchanges > 0 && ev->index < (u_int) nchanges && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) == (uintptr_t) ev) @@ -237,7 +238,8 @@ ev->disabled = 0; ev->posted = 0; - if (nchanges > 0 + if (ngx_thread_main() + && nchanges > 0 && ev->index < (u_int) nchanges && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) == (uintptr_t) ev) @@ -280,6 +282,7 @@ { struct timespec ts; ngx_connection_t *c; + struct kevent *kev, kv; c = ev->data; @@ -287,7 +290,7 @@ "kevent set event: %d: ft:%d fl:%04X", c->fd, filter, flags); - if (nchanges >= max_changes) { + if (ngx_thread_main() && nchanges >= max_changes) { ngx_log_error(NGX_LOG_WARN, ev->log, 0, "kqueue change list is filled up"); @@ -302,40 +305,52 @@ nchanges = 0; } - change_list[nchanges].ident = c->fd; - change_list[nchanges].filter = filter; - change_list[nchanges].flags = flags; - change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); + kev = ngx_thread_main() ? &change_list[nchanges] : &kv; + + kev->ident = c->fd; + kev->filter = filter; + kev->flags = flags; + kev->udata = (void *) ((uintptr_t) ev | ev->instance); if (filter == EVFILT_VNODE) { - change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND - |NOTE_ATTRIB|NOTE_RENAME + kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND + |NOTE_ATTRIB|NOTE_RENAME #if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \ || __FreeBSD_version >= 500018 - |NOTE_REVOKE + |NOTE_REVOKE #endif ; - change_list[nchanges].data = 0; + kev->data = 0; } else { #if (HAVE_LOWAT_EVENT) if (flags & NGX_LOWAT_EVENT) { - change_list[nchanges].fflags = NOTE_LOWAT; - change_list[nchanges].data = ev->available; + kev->fflags = NOTE_LOWAT; + kev->data = ev->available; } else { - change_list[nchanges].fflags = 0; - change_list[nchanges].data = 0; + kev->fflags = 0; + kev->data = 0; } #else - change_list[nchanges].fflags = 0; - change_list[nchanges].data = 0; + kev->fflags = 0; + kev->data = 0; #endif } - ev->index = nchanges; + if (ngx_thread_main()) { + ev->index = nchanges; + nchanges++; - nchanges++; + } else { + ts.tv_sec = 0; + ts.tv_nsec = 0; + + if (kevent(ngx_kqueue, &kv, 1, NULL, 0, &ts) == -1) { + ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); + return NGX_ERROR; + } + } return NGX_OK; }
--- a/src/event/ngx_event_posted.c Mon Jun 28 16:05:02 2004 +0000 +++ b/src/event/ngx_event_posted.c Mon Jun 28 21:03:14 2004 +0000 @@ -92,13 +92,16 @@ || (ev->use_instance && ev->instance != ev->returned_instance)) { /* - * the stale event from a file descriptor - * that was just closed in this iteration + * The stale event from a file descriptor that was just + * closed in this iteration. We use ngx_cycle->log + * because ev->log may be already destoyed. */ - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "kevent: stale event " PTR_FMT, ev); + ngx_unlock(ev->lock); + ev = ev->next; continue;
--- a/src/event/ngx_event_posted.h Mon Jun 28 16:05:02 2004 +0000 +++ b/src/event/ngx_event_posted.h Mon Jun 28 21:03:14 2004 +0000 @@ -8,9 +8,11 @@ #define ngx_post_event(ev) \ + if (!ev->posted) { \ ev->next = (ngx_event_t *) ngx_posted_events; \ ngx_posted_events = ev; \ - ev->posted = 1; + ev->posted = 1; \ + } void ngx_event_process_posted(ngx_cycle_t *cycle);
--- a/src/event/ngx_event_timer.c Mon Jun 28 16:05:02 2004 +0000 +++ b/src/event/ngx_event_timer.c Mon Jun 28 21:03:14 2004 +0000 @@ -87,9 +87,11 @@ ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, rbtree_key)); +#if (NGX_THREADS) if (ngx_trylock(ev->lock) == 0) { break; } +#endif ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, "event timer del: %d: %d", @@ -109,7 +111,9 @@ ev->timer_set = 0; ev->timedout = 1; +#if (NGX_THREADS) ngx_unlock(ev->lock); +#endif if (ngx_threaded) { if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
--- a/src/http/ngx_http_request.c Mon Jun 28 16:05:02 2004 +0000 +++ b/src/http/ngx_http_request.c Mon Jun 28 21:03:14 2004 +0000 @@ -1708,6 +1708,8 @@ void ngx_http_close_connection(ngx_connection_t *c) { + ngx_socket_t fd; + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "close http connection: %d", c->fd); @@ -1737,15 +1739,24 @@ } } - if (ngx_close_socket(c->fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } + fd = c->fd; c->fd = (ngx_socket_t) -1; c->data = NULL; + ngx_destroy_pool(c->pool); - ngx_destroy_pool(c->pool); + /* + * we has to clean the connection before the closing because another thread + * may reopen the same file descriptor before we clean the connection + */ + + if (ngx_close_socket(fd) == -1) { + + /* we use ngx_cycle->log because c->log was in c->pool */ + + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno, + ngx_close_socket_n " failed"); + } return; }
--- a/src/os/unix/ngx_freebsd_rfork_thread.c Mon Jun 28 16:05:02 2004 +0000 +++ b/src/os/unix/ngx_freebsd_rfork_thread.c Mon Jun 28 21:03:14 2004 +0000 @@ -399,6 +399,10 @@ return NGX_ERROR; } + ngx_log_debug2(NGX_LOG_DEBUG_CORE, m->log, 0, + "mutex waked up " PTR_FMT " lock:%X", + m, m->lock); + tries = 0; old = m->lock; continue; @@ -505,6 +509,9 @@ /* wake up the thread that waits on semaphore */ + ngx_log_debug1(NGX_LOG_DEBUG_CORE, m->log, 0, + "wake up mutex " PTR_FMT "", m); + op.sem_num = 0; op.sem_op = 1; op.sem_flg = SEM_UNDO;
--- a/src/os/unix/ngx_thread.h Mon Jun 28 16:05:02 2004 +0000 +++ b/src/os/unix/ngx_thread.h Mon Jun 28 21:03:14 2004 +0000 @@ -77,6 +77,8 @@ } +#define ngx_thread_main() (ngx_gettid() == 0) + #else /* use pthreads */ @@ -124,6 +126,10 @@ #define ngx_mutex_lock(m) NGX_OK #define ngx_mutex_unlock(m) +#define ngx_cond_signal(cv) + +#define ngx_thread_main() 1 + #endif