aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2005-12-16 15:07:08 +0000
committerIgor Sysoev <igor@sysoev.ru>2005-12-16 15:07:08 +0000
commit2402502c2f35b831ee89369a532b1ff4e4e19947 (patch)
tree37fb834956f497f8b2d2862c6c3514e1a25bfb37 /src/os/unix
parent74297c285ef173784cac505fd406267ac7c8d3c7 (diff)
downloadnginx-2402502c2f35b831ee89369a532b1ff4e4e19947.tar.gz
nginx-2402502c2f35b831ee89369a532b1ff4e4e19947.zip
nginx-0.3.16-RELEASE importrelease-0.3.16
*) Feature: the ngx_http_map_module. *) Feature: the "types_hash_max_size" and "types_hash_bucket_size" directives. *) Feature: the "ssi_value_length" directive. *) Feature: the "worker_rlimit_core" directive. *) Workaround: the connection number in logs was always 1 if nginx was built by the icc 8.1 or 9.0 compilers with optimization for Pentium 4. *) Bugfix: the "config timefmt" SSI command set incorrect time format. *) Bugfix: nginx did not close connection to IMAP/POP3 backend for the SSL connections; the bug had appeared in 0.3.13. Thanks to Rob Mueller. *) Bugfix: segmentation fault may occurred in at SSL shutdown; the bug had appeared in 0.3.13.
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_alloc.c3
-rw-r--r--src/os/unix/ngx_alloc.h3
-rw-r--r--src/os/unix/ngx_gcc_atomic_x86.h13
-rw-r--r--src/os/unix/ngx_linux_sendfile_chain.c32
-rw-r--r--src/os/unix/ngx_posix_init.c1
-rw-r--r--src/os/unix/ngx_process_cycle.c11
6 files changed, 46 insertions, 17 deletions
diff --git a/src/os/unix/ngx_alloc.c b/src/os/unix/ngx_alloc.c
index 72cf4e42e..25606e2f6 100644
--- a/src/os/unix/ngx_alloc.c
+++ b/src/os/unix/ngx_alloc.c
@@ -8,7 +8,8 @@
#include <ngx_core.h>
-int ngx_pagesize;
+int ngx_pagesize;
+ngx_uint_t ngx_cacheline_size;
void *
diff --git a/src/os/unix/ngx_alloc.h b/src/os/unix/ngx_alloc.h
index 66562a191..a88818e2e 100644
--- a/src/os/unix/ngx_alloc.h
+++ b/src/os/unix/ngx_alloc.h
@@ -36,7 +36,8 @@ void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log);
#endif
-extern int ngx_pagesize;
+extern int ngx_pagesize;
+extern ngx_uint_t ngx_cacheline_size;
#endif /* _NGX_ALLOC_H_INCLUDED_ */
diff --git a/src/os/unix/ngx_gcc_atomic_x86.h b/src/os/unix/ngx_gcc_atomic_x86.h
index b458032b5..8e3480d71 100644
--- a/src/os/unix/ngx_gcc_atomic_x86.h
+++ b/src/os/unix/ngx_gcc_atomic_x86.h
@@ -61,7 +61,16 @@ ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
*/
-#if !(__GNUC__ == 2 && __GNUC_MINOR__ <= 7)
+#if !(( __GNUC__ == 2 && __GNUC_MINOR__ <= 7 ) || ( __INTEL_COMPILER >= 800 ))
+
+/*
+ * icc 8.1 and 9.0 compile broken code with -march=pentium4 option:
+ * ngx_atomic_fetch_add() always return the input "add" value,
+ * so we use the gcc 2.7 version.
+ *
+ * icc 8.1 and 9.0 with -march=pentiumpro option or icc 7.1 compile
+ * correct code.
+ */
static ngx_inline ngx_atomic_int_t
ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
@@ -77,7 +86,7 @@ ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
}
-#else /* (__GNUC__ == 2 && __GNUC_MINOR__ <= 7) */
+#else
/*
* gcc 2.7 does not support "+q", so we have to use the fixed %eax ("=a" and
diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c
index f3830a8b3..225f9e1ec 100644
--- a/src/os/unix/ngx_linux_sendfile_chain.c
+++ b/src/os/unix/ngx_linux_sendfile_chain.c
@@ -26,21 +26,21 @@
ngx_chain_t *
ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{
- int rc, tcp_nodelay;
- u_char *prev;
- off_t size, send, prev_send, aligned, sent, fprev;
- size_t file_size;
- ngx_uint_t eintr, complete;
- ngx_err_t err;
- ngx_buf_t *file;
- ngx_array_t header;
- ngx_event_t *wev;
- ngx_chain_t *cl;
- struct iovec *iov, headers[NGX_HEADERS];
+ int rc, tcp_nodelay;
+ off_t size, send, prev_send, aligned, sent, fprev;
+ u_char *prev;
+ size_t file_size;
+ ngx_err_t err;
+ ngx_buf_t *file;
+ ngx_uint_t eintr, complete;
+ ngx_array_t header;
+ ngx_event_t *wev;
+ ngx_chain_t *cl;
+ struct iovec *iov, headers[NGX_HEADERS];
#if (NGX_HAVE_SENDFILE64)
- off_t offset;
+ off_t offset;
#else
- int32_t offset;
+ int32_t offset;
#endif
wev = c->write;
@@ -233,6 +233,12 @@ ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
}
if (file) {
+#if 1
+ if (file_size == 0) {
+ ngx_debug_point();
+ return NGX_CHAIN_ERROR;
+ }
+#endif
#if (NGX_HAVE_SENDFILE64)
offset = file->file_pos;
#else
diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c
index 4968de5b9..83d5f3024 100644
--- a/src/os/unix/ngx_posix_init.c
+++ b/src/os/unix/ngx_posix_init.c
@@ -39,6 +39,7 @@ ngx_os_init(ngx_log_t *log)
ngx_init_setproctitle(log);
ngx_pagesize = getpagesize();
+ ngx_cacheline_size = NGX_CPU_CACHE_LINE;
if (ngx_ncpu == 0) {
ngx_ncpu = 1;
diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c
index 14bbe80b2..a262ba5eb 100644
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -787,6 +787,17 @@ ngx_worker_process_init(ngx_cycle_t *cycle, ngx_uint_t priority)
}
}
+ if (ccf->rlimit_core != NGX_CONF_UNSET) {
+ rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;
+ rlmt.rlim_max = (rlim_t) ccf->rlimit_core;
+
+ if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+ "setrlimit(RLIMIT_CORE, %i) failed",
+ ccf->rlimit_core);
+ }
+ }
+
#ifdef RLIMIT_SIGPENDING
if (ccf->rlimit_sigpending != NGX_CONF_UNSET) {
rlmt.rlim_cur = (rlim_t) ccf->rlimit_sigpending;