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
+++ 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(
 
         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(
 
     } 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;
         }
     }