# HG changeset patch # User Igor Sysoev # Date 1068498562 0 # Node ID a8ff48d26cca369c06edd35a4a4307daae5e51d3 # Parent 4db54fdbcbe71e9b1fb8d60946aac1fe4317c29d nginx-0.0.1-2003-11-11-00:09:22 import diff -r 4db54fdbcbe7 -r a8ff48d26cca src/core/ngx_core.h --- a/src/core/ngx_core.h Mon Nov 10 17:17:31 2003 +0000 +++ b/src/core/ngx_core.h Mon Nov 10 21:09:22 2003 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff -r 4db54fdbcbe7 -r a8ff48d26cca src/core/ngx_times.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/core/ngx_times.c Mon Nov 10 21:09:22 2003 +0000 @@ -0,0 +1,51 @@ + +#include +#include + + +time_t ngx_cached_time; + +static char cached_http_time[] = "Mon, 28 Sep 1970 06:00:00 GMT"; +ngx_str_t ngx_cached_http_time; + +static char cached_http_log_time[] = "28/Sep/1970:12:00:00"; +ngx_str_t ngx_cached_http_log_time; + + +time_t ngx_time() +{ + return ngx_cached_time; +} + + +/* TODO: remove strftime() */ + +void ngx_time_update() +{ + ngx_tm_t *tp, tm; + static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + + /* STUB: need to move to ngx_init_time() */ + ngx_cached_http_time.data = cached_http_time; + ngx_cached_http_log_time.data = cached_http_log_time; + + tp = gmtime(&ngx_cached_time); + + ngx_cached_http_time.len = strftime(ngx_cached_http_time.data, + sizeof("Mon, 28 Sep 1970 06:00:00 GMT"), + "%a, %d %b %Y %H:%M:%S GMT", tp); + + + ngx_localtime(&tm); + + ngx_cached_http_log_time.len = ngx_snprintf(ngx_cached_http_log_time.data, + sizeof("28/Sep/1970:12:00:00"), + "%02d/%s/%d:%02d:%02d:%02d", + tm.ngx_tm_mday, + months[tm.ngx_tm_mon - 1], + tm.ngx_tm_year, + tm.ngx_tm_hour, + tm.ngx_tm_min, + tm.ngx_tm_sec); +} diff -r 4db54fdbcbe7 -r a8ff48d26cca src/core/ngx_times.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/core/ngx_times.h Mon Nov 10 21:09:22 2003 +0000 @@ -0,0 +1,18 @@ +#ifndef _NGX_TIMES_H_INCLUDED_ +#define _NGX_TIMES_H_INCLUDED_ + + +#include +#include + + +time_t ngx_time(); +void ngx_time_update(); + + +extern time_t ngx_cached_time; +extern ngx_str_t ngx_cached_http_time; +extern ngx_str_t ngx_cached_http_log_time; + + +#endif /* _NGX_TIMES_H_INCLUDED_ */ diff -r 4db54fdbcbe7 -r a8ff48d26cca src/event/modules/ngx_devpoll_module.c --- a/src/event/modules/ngx_devpoll_module.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/event/modules/ngx_devpoll_module.c Mon Nov 10 21:09:22 2003 +0000 @@ -366,8 +366,14 @@ nchanges = 0; + gettimeofday(&tv, NULL); + + if (ngx_cached_time != tv.tv_sec) { + ngx_cached_time = tv.tv_sec; + ngx_time_update(); + } + if ((int) timer != INFTIM) { - gettimeofday(&tv, NULL); delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; #if (NGX_DEBUG_EVENT) diff -r 4db54fdbcbe7 -r a8ff48d26cca src/event/modules/ngx_iocp_module.c --- a/src/event/modules/ngx_iocp_module.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/event/modules/ngx_iocp_module.c Mon Nov 10 21:09:22 2003 +0000 @@ -189,6 +189,8 @@ err = 0; } + /* TODO: timer */ + if (timer != INFINITE) { delta = ngx_msec() - delta; ngx_event_expire_timers(delta); diff -r 4db54fdbcbe7 -r a8ff48d26cca src/event/modules/ngx_kqueue_module.c --- a/src/event/modules/ngx_kqueue_module.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/event/modules/ngx_kqueue_module.c Mon Nov 10 21:09:22 2003 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru + * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru/en/ */ @@ -347,16 +347,24 @@ nchanges = 0; + gettimeofday(&tv, NULL); + + if (ngx_cached_time != tv.tv_sec) { + ngx_cached_time = tv.tv_sec; + ngx_time_update(); + } + if (timer) { - gettimeofday(&tv, NULL); delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; #if (NGX_DEBUG_EVENT) ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta); #endif - /* The expired timers must be handled before a processing of the events - because the new timers can be added during a processing */ + /* + * The expired timers must be handled before a processing of the events + * because the new timers can be added during a processing + */ ngx_event_expire_timers(delta); @@ -413,8 +421,10 @@ instance = (uintptr_t) ev & 1; ev = (void *) ((uintptr_t) ev & ~1); - /* It's a stale event from a file descriptor - that was just closed in this iteration */ + /* + * it's a stale event from a file descriptor + * that was just closed in this iteration + */ if (ev->active == 0 || ev->instance != instance) { ngx_log_debug(log, "stale kevent"); diff -r 4db54fdbcbe7 -r a8ff48d26cca src/event/modules/ngx_poll_module.c --- a/src/event/modules/ngx_poll_module.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/event/modules/ngx_poll_module.c Mon Nov 10 21:09:22 2003 +0000 @@ -259,6 +259,8 @@ ngx_log_debug(log, "poll ready %d" _ ready); + /* TODO: time */ + if ((int) timer != INFTIM) { delta = ngx_msec() - delta; diff -r 4db54fdbcbe7 -r a8ff48d26cca src/event/modules/ngx_select_module.c --- a/src/event/modules/ngx_select_module.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/event/modules/ngx_select_module.c Mon Nov 10 21:09:22 2003 +0000 @@ -314,6 +314,8 @@ ngx_log_debug(log, "select ready %d" _ ready); #endif + /* TODO: time */ + if (timer) { #if (HAVE_SELECT_CHANGE_TIMEOUT) delta = timer - (tv.tv_sec * 1000 + tv.tv_usec / 1000); diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/modules/proxy/ngx_http_proxy_cache.c --- a/src/http/modules/proxy/ngx_http_proxy_cache.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/modules/proxy/ngx_http_proxy_cache.c Mon Nov 10 21:09:22 2003 +0000 @@ -288,6 +288,8 @@ return; } + ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock); + if (rc == NGX_DONE) { ft_type = NGX_HTTP_PROXY_FT_BUSY_LOCK; diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/modules/proxy/ngx_http_proxy_handler.c --- a/src/http/modules/proxy/ngx_http_proxy_handler.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/modules/proxy/ngx_http_proxy_handler.c Mon Nov 10 21:09:22 2003 +0000 @@ -503,7 +503,7 @@ { ngx_http_proxy_ctx_t *p; - p = ngx_http_get_module_ctx(r, ngx_http_proxy_module); + p = ngx_http_get_module_err_ctx(r, ngx_http_proxy_module); if (p == NULL) { *buf = '-'; @@ -520,11 +520,15 @@ *buf++ = '/'; - *buf++ = 'X'; + *buf++ = '_'; *buf++ = '/'; - *buf++ = 'X'; + *buf++ = '_'; + + *buf++ = '/'; + + *buf++ = '_'; *buf++ = ' '; @@ -554,6 +558,9 @@ buf += ngx_snprintf(buf, NGX_TIME_LEN, TIME_FMT, p->state->expires); } + *buf++ = ' '; + *buf++ = '_'; + return buf; } @@ -563,7 +570,7 @@ { ngx_http_proxy_ctx_t *p; - p = ngx_http_get_module_ctx(r, ngx_http_proxy_module); + p = ngx_http_get_module_err_ctx(r, ngx_http_proxy_module); if (p == NULL || p->state->cache_state == 0) { *buf = '-'; @@ -580,7 +587,7 @@ { ngx_http_proxy_ctx_t *p; - p = ngx_http_get_module_ctx(r, ngx_http_proxy_module); + p = ngx_http_get_module_err_ctx(r, ngx_http_proxy_module); if (p == NULL || p->state->reason == 0) { *buf = '-'; diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/modules/proxy/ngx_http_proxy_upstream.c --- a/src/http/modules/proxy/ngx_http_proxy_upstream.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/modules/proxy/ngx_http_proxy_upstream.c Mon Nov 10 21:09:22 2003 +0000 @@ -337,6 +337,8 @@ return; } + ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock); + if (rc == NGX_DONE) { ft_type = NGX_HTTP_PROXY_FT_BUSY_LOCK; @@ -1053,27 +1055,24 @@ if (p->upstream->peer.connection) { if (ep->upstream_done && p->cachable) { if (ngx_http_proxy_update_cache(p) == NGX_ERROR) { - ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock); + ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock); ngx_http_proxy_finalize_request(p, 0); return; } - ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock); - } else if (ep->upstream_eof && p->cachable) { /* TODO: check length & update cache */ if (ngx_http_proxy_update_cache(p) == NGX_ERROR) { - ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock); + ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock); ngx_http_proxy_finalize_request(p, 0); return; } - - ngx_http_busy_unlock_cachable(p->lcf->busy_lock, &p->busy_lock); } if (ep->upstream_done || ep->upstream_eof || ep->upstream_error) { + ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock); ngx_http_proxy_close_connection(p); } } @@ -1104,6 +1103,8 @@ ngx_log_debug(p->request->connection->log, "next upstream: %d" _ ft_type); + ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock); + if (ft_type != NGX_HTTP_PROXY_FT_HTTP_404) { ngx_event_connect_peer_failed(&p->upstream->peer); } diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http.h --- a/src/http/ngx_http.h Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http.h Mon Nov 10 21:09:22 2003 +0000 @@ -21,6 +21,8 @@ #define ngx_http_get_module_ctx(r, module) r->ctx[module.ctx_index] +#define ngx_http_get_module_err_ctx(r, module) \ + (r->err_ctx ? r->err_ctx[module.ctx_index] : r->ctx[module.ctx_index]) #define ngx_http_create_ctx(r, cx, module, size, error) \ do { \ diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http_busy_lock.c --- a/src/http/ngx_http_busy_lock.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http_busy_lock.c Mon Nov 10 21:09:22 2003 +0000 @@ -100,11 +100,14 @@ } -void ngx_http_busy_unlock_cachable(ngx_http_busy_lock_t *bl, - ngx_http_busy_lock_ctx_t *bc) +void ngx_http_busy_unlock(ngx_http_busy_lock_t *bl, + ngx_http_busy_lock_ctx_t *bc) { - bl->md5_mask[bc->slot / 8] &= ~(1 << (bc->slot & 7)); - bl->cachable--; + if (bl->md5) { + bl->md5_mask[bc->slot / 8] &= ~(1 << (bc->slot & 7)); + bl->cachable--; + } + bl->busy--; } diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http_busy_lock.h --- a/src/http/ngx_http_busy_lock.h Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http_busy_lock.h Mon Nov 10 21:09:22 2003 +0000 @@ -38,8 +38,8 @@ int ngx_http_busy_lock(ngx_http_busy_lock_t *bl, ngx_http_busy_lock_ctx_t *bc); int ngx_http_busy_lock_cachable(ngx_http_busy_lock_t *bl, ngx_http_busy_lock_ctx_t *bc, int lock); -void ngx_http_busy_unlock_cachable(ngx_http_busy_lock_t *bl, - ngx_http_busy_lock_ctx_t *bc); +void ngx_http_busy_unlock(ngx_http_busy_lock_t *bl, + ngx_http_busy_lock_ctx_t *bc); char *ngx_http_set_busy_lock_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http_core_module.c --- a/src/http/ngx_http_core_module.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http_core_module.c Mon Nov 10 21:09:22 2003 +0000 @@ -429,6 +429,11 @@ return NGX_OK; } + if (r->err_status) { + r->headers_out.status = r->err_status; + r->headers_out.status_line.len = 0; + } + return (*ngx_http_top_header_filter)(r); } @@ -495,7 +500,18 @@ } /* clear the modules contexts */ - ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module); + + if (r->error_page) { + r->err_status = r->headers_out.status; + r->err_ctx = r->ctx; + r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module); + if (r->ctx == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + } else { + ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module); + } r->phase = 0; r->phase_handler = 0; diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http_header_filter.c --- a/src/http/ngx_http_header_filter.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http_header_filter.c Mon Nov 10 21:09:22 2003 +0000 @@ -116,6 +116,7 @@ #endif } else { + if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY) { /* 2XX */ status = r->headers_out.status - NGX_HTTP_OK; @@ -240,7 +241,8 @@ #if (NGX_HTTP_LOG_ALL_HEADERS_OUT) p = h->last; #endif - h->last += ngx_http_get_time(h->last, ngx_time()); + h->last = ngx_cpymem(h->last, ngx_cached_http_time.data, + ngx_cached_http_time.len); #if (NGX_HTTP_LOG_ALL_HEADERS_OUT) r->headers_out.date = ngx_palloc(r->pool, sizeof(ngx_table_elt_t)); diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http_log_handler.c --- a/src/http/ngx_http_log_handler.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http_log_handler.c Mon Nov 10 21:09:22 2003 +0000 @@ -210,6 +210,10 @@ static char *ngx_http_log_time(ngx_http_request_t *r, char *buf, uintptr_t data) { + return ngx_cpymem(buf, ngx_cached_http_log_time.data, + ngx_cached_http_log_time.len); + +#if 0 ngx_tm_t tm; ngx_localtime(&tm); @@ -219,6 +223,7 @@ tm.ngx_tm_mday, months[tm.ngx_tm_mon - 1], tm.ngx_tm_year, tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec); +#endif } @@ -237,7 +242,8 @@ static char *ngx_http_log_status(ngx_http_request_t *r, char *buf, uintptr_t data) { - return buf + ngx_snprintf(buf, 4, "%d", r->headers_out.status); + return buf + ngx_snprintf(buf, 4, "%d", + r->err_status ? r->err_status : r->headers_out.status); } diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http_log_handler.h --- a/src/http/ngx_http_log_handler.h Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http_log_handler.h Mon Nov 10 21:09:22 2003 +0000 @@ -16,9 +16,9 @@ #define NGX_HTTP_LOG_ARG (u_int) -1 /* STUB */ -#define NGX_INT32_LEN sizeof("4294967296") - 1 -#define NGX_TIME_LEN sizeof("4294967296") - 1 -#define NGX_OFF_LEN sizeof("18446744073709551616") - 1 +#define NGX_INT32_LEN sizeof("-2147483648") - 1 +#define NGX_TIME_LEN sizeof("-2147483648") - 1 +#define NGX_OFF_LEN sizeof("-9223372036854775808") - 1 typedef struct { diff -r 4db54fdbcbe7 -r a8ff48d26cca src/http/ngx_http_request.h --- a/src/http/ngx_http_request.h Mon Nov 10 17:17:31 2003 +0000 +++ b/src/http/ngx_http_request.h Mon Nov 10 21:09:22 2003 +0000 @@ -192,6 +192,8 @@ void *data; char *discarded_buffer; + void **err_ctx; + int err_status; /* URI is not started with '/' - "GET http://" */ unsigned unusual_uri:1; diff -r 4db54fdbcbe7 -r a8ff48d26cca src/os/unix/ngx_time.c --- a/src/os/unix/ngx_time.c Mon Nov 10 17:17:31 2003 +0000 +++ b/src/os/unix/ngx_time.c Mon Nov 10 21:09:22 2003 +0000 @@ -1,11 +1,12 @@ #include -#include +#include + void ngx_localtime(ngx_tm_t *tm) { - time_t clock = time(NULL); - localtime_r(&clock, tm); + localtime_r(&ngx_cached_time, tm); + tm->ngx_tm_mon++; tm->ngx_tm_year += 1900; } diff -r 4db54fdbcbe7 -r a8ff48d26cca src/os/unix/ngx_time.h --- a/src/os/unix/ngx_time.h Mon Nov 10 17:17:31 2003 +0000 +++ b/src/os/unix/ngx_time.h Mon Nov 10 21:09:22 2003 +0000 @@ -23,8 +23,10 @@ ngx_msec_t ngx_msec(void); -/* STUB */ -#define ngx_time() time(NULL) +time_t ngx_time(); + +extern time_t ngx_cached_time; + #endif /* _NGX_TIME_H_INCLUDED_ */