summaryrefslogtreecommitdiffhomepage
path: root/src/os/unix/ngx_freebsd_sendfile_chain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/unix/ngx_freebsd_sendfile_chain.c')
-rw-r--r--src/os/unix/ngx_freebsd_sendfile_chain.c19
1 files changed, 12 insertions, 7 deletions
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;
}
}