diff options
author | Igor Sysoev <igor@sysoev.ru> | 2003-06-02 15:24:30 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2003-06-02 15:24:30 +0000 |
commit | 7578ec9df43bbb31db5291f1b76359d10900a679 (patch) | |
tree | 87d7b3cb729c0e07b21d52737fd76e12a0c17d72 /src/os/unix | |
parent | aa3436c04c222d57498bfa34c9fdec50f07fd08d (diff) | |
download | nginx-7578ec9df43bbb31db5291f1b76359d10900a679.tar.gz nginx-7578ec9df43bbb31db5291f1b76359d10900a679.zip |
nginx-0.0.1-2003-06-02-19:24:30 import
Diffstat (limited to 'src/os/unix')
-rw-r--r-- | src/os/unix/ngx_files.h | 13 | ||||
-rw-r--r-- | src/os/unix/ngx_freebsd_init.c | 20 | ||||
-rw-r--r-- | src/os/unix/ngx_freebsd_init.h | 2 | ||||
-rw-r--r-- | src/os/unix/ngx_freebsd_sendfile_chain.c | 19 |
4 files changed, 40 insertions, 14 deletions
diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h index 37d136af7..e2af7222c 100644 --- a/src/os/unix/ngx_files.h +++ b/src/os/unix/ngx_files.h @@ -15,20 +15,29 @@ -#define ngx_open_file open +#define ngx_open_file(name, access, create) \ + open(name, access|create, 0644) #define ngx_open_file_n "open()" +#define NGX_FILE_RDONLY O_RDONLY +#define NGX_FILE_RDWR O_RDWR +#define NGX_FILE_CREATE_OR_OPEN O_CREAT +#define NGX_FILE_OPEN 0 +#define NGX_FILE_APPEND O_APPEND + + #define ngx_close_file close #define ngx_close_file_n "close()" + #define ngx_open_tempfile(name, persistent) \ open(name, O_CREAT|O_EXCL|O_RDWR, 0600) #define ngx_open_tempfile_n "open()" + ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset); #define ngx_read_file_n "read()" -#define NGX_FILE_RDONLY O_RDONLY ssize_t ngx_write_file(ngx_file_t *file, char *buf, size_t size, off_t offset); diff --git a/src/os/unix/ngx_freebsd_init.c b/src/os/unix/ngx_freebsd_init.c index cacc4579f..e01f9b613 100644 --- a/src/os/unix/ngx_freebsd_init.c +++ b/src/os/unix/ngx_freebsd_init.c @@ -9,6 +9,7 @@ int ngx_freebsd_kern_osreldate; int ngx_freebsd_hw_ncpu; int ngx_freebsd_net_inet_tcp_sendspace; int ngx_freebsd_sendfile_nbytes_bug; +int ngx_freebsd_tcp_nopush_flush; /* FreeBSD 5.0 */ int ngx_freebsd_kern_ipc_zero_copy_send; @@ -39,6 +40,8 @@ sysctl_t sysctls[] = { &ngx_freebsd_net_inet_tcp_sendspace, sizeof(int)}, + /* FreeBSD 5.0 */ + {"kern.ipc.zero_copy.send", &ngx_freebsd_kern_ipc_zero_copy_send, sizeof(int)}, @@ -49,7 +52,7 @@ sysctl_t sysctls[] = { int ngx_os_init(ngx_log_t *log) { - int i; + int i, version; size_t size; ngx_err_t err; @@ -81,9 +84,11 @@ int ngx_os_init(ngx_log_t *log) return NGX_ERROR; } + version = ngx_freebsd_kern_osreldate; + ngx_log_error(NGX_LOG_INFO, log, 0, "kern.osreldate: %d, built on %d", - ngx_freebsd_kern_osreldate, __FreeBSD_version); + version, __FreeBSD_version); #if (HAVE_FREEBSD_SENDFILE) @@ -91,12 +96,12 @@ int ngx_os_init(ngx_log_t *log) /* The determination of the sendfile() nbytes bug is complex enough. There're two sendfile() syscalls: a new 393 has no bug while an old 336 has the bug in some versions and has not in others. - libc_r wrapper also emulates the bug in some versions. + Besides libc_r wrapper also emulates the bug in some versions. There's no way to say exactly if a given FreeBSD version has bug. - Here is the algorithm that work at least for RELEASEs + Here is the algorithm that works at least for RELEASEs and for syscalls only (not libc_r wrapper). */ - /* detect was the new sendfile() version available at the compile time + /* detect the new sendfile() version available at the compile time to allow an old binary to run correctly on an updated FreeBSD system. */ #if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \ @@ -115,6 +120,11 @@ int ngx_os_init(ngx_log_t *log) #endif /* HAVE_FREEBSD_SENDFILE */ + if ((version < 500000 && version >= 440003) || version >= 500017) { + ngx_freebsd_tcp_nopush_flush = 1; + } + + for (i = 0; sysctls[i].name; i++) { *sysctls[i].value = 0; size = sysctls[i].size; diff --git a/src/os/unix/ngx_freebsd_init.h b/src/os/unix/ngx_freebsd_init.h index cc450f914..967951d8d 100644 --- a/src/os/unix/ngx_freebsd_init.h +++ b/src/os/unix/ngx_freebsd_init.h @@ -20,6 +20,8 @@ extern int ngx_freebsd_kern_osreldate; extern int ngx_freebsd_hw_ncpu; extern int ngx_freebsd_net_inet_tcp_sendspace; extern int ngx_freebsd_sendfile_nbytes_bug; +extern int ngx_freebsd_tcp_nopush_flush; +extern int ngx_freebsd_kern_ipc_zero_copy_send; #endif /* _NGX_FREEBSD_INIT_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c index bdb7250c9..cd21ed904 100644 --- a/src/os/unix/ngx_freebsd_sendfile_chain.c +++ b/src/os/unix/ngx_freebsd_sendfile_chain.c @@ -13,9 +13,9 @@ and the first part of the file in one packet but also sends 4K pages in the full packets. - The turning TCP_NOPUSH off flushes any pending data at least in FreeBSD 4.2, - although there's special fix in src/sys/netinet/tcp_usrreq.c just before - FreeBSD 4.5. + Until FreeBSD 4.5 the turning TCP_NOPUSH off does not not flush + the pending data that less than MSS and the data sent with 5 second delay. + So we use TCP_NOPUSH on FreeBSD 4.5+ only. */ @@ -105,14 +105,15 @@ ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in) if (file) { - if (tcp_nopush == 0) { + if (!c->tcp_nopush && ngx_freebsd_tcp_nopush_flush) { + c->tcp_nopush = 1; tcp_nopush = 1; if (setsockopt(c->fd, IPPROTO_TCP, TCP_NOPUSH, (const void *) &tcp_nopush, sizeof(int)) == -1) { ngx_log_error(NGX_LOG_CRIT, c->log, ngx_errno, - "setsockopt(TCP_NO_PUSH) failed"); + "setsockopt(TCP_NOPUSH) failed"); return NGX_CHAIN_ERROR; } } @@ -221,14 +222,18 @@ ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in) } while ((tail && tail == ce) || eintr); - if (tcp_nopush == 1) { + /* STUB: should be in app code, no need to clear TCP_NOPUSH + if the conneciton close()d or shutdown()ed */ + + if (c->tcp_nopush) { + c->tcp_nopush = 0; tcp_nopush = 0; if (setsockopt(c->fd, IPPROTO_TCP, TCP_NOPUSH, (const void *) &tcp_nopush, sizeof(int)) == -1) { ngx_log_error(NGX_LOG_CRIT, c->log, ngx_errno, - "setsockopt(!TCP_NO_PUSH) failed"); + "setsockopt(!TCP_NOPUSH) failed"); return NGX_CHAIN_ERROR; } } |