Mercurial > hg > nginx
diff src/os/unix/ngx_freebsd_sendfile_chain.c @ 99:a059e1aa65d4
nginx-0.0.1-2003-06-02-19:24:30 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 02 Jun 2003 15:24:30 +0000 |
parents | a23d010f356d |
children | 2e069b6e6920 |
line wrap: on
line diff
--- a/src/os/unix/ngx_freebsd_sendfile_chain.c Fri May 30 14:27:59 2003 +0000 +++ b/src/os/unix/ngx_freebsd_sendfile_chain.c Mon Jun 02 15:24:30 2003 +0000 @@ -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 @@ 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 @@ } 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; } }