]> err.no Git - varnish/commitdiff
Look for the new SF_SYNC facility in FreeBSDs sendfile(2), and if we
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 3 Feb 2008 15:59:01 +0000 (15:59 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 3 Feb 2008 15:59:01 +0000 (15:59 +0000)
find it, allow its use, but still default to off via sendfile_threshold
paramter.

SF_SYNC is only available in FreeBSD-current as of a few seconds
ago, and is unlikely to appear in any release before FreeBSD-8.0
for intricate reasons of ABI compliance.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2417 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_pool.c
varnish-cache/bin/varnishd/cache_response.c
varnish-cache/bin/varnishd/heritage.h
varnish-cache/bin/varnishd/mgt_param.c
varnish-cache/configure.ac

index a3a34d6948681c0101d4e55dca07d2c87679c292..2f88c25eb97706daf910e0dd26efa3b7e1a212c7 100644 (file)
@@ -541,9 +541,9 @@ void WRK_Reset(struct worker *w, int *fd);
 unsigned WRK_Flush(struct worker *w);
 unsigned WRK_Write(struct worker *w, const void *ptr, int len);
 unsigned WRK_WriteH(struct worker *w, const txt *hh, const char *suf);
-#ifdef HAVE_SENDFILE
+#ifdef SENDFILE_WORKS
 void WRK_Sendfile(struct worker *w, int fd, off_t off, unsigned len);
-#endif  /* HAVE_SENDFILE */
+#endif  /* SENDFILE_WORKS */
 
 /* cache_session.c [SES] */
 void SES_Init(void);
index a5d961e2610ddd2af45ecb359ff28fc1d9667524..90edfe2ea5956159efadf84b45a19b7644828417 100644 (file)
@@ -34,7 +34,7 @@
 #include <sys/types.h>
 #include <sys/uio.h>
 
-#ifdef HAVE_SENDFILE
+#ifdef SENDFILE_WORKS
 #if defined(__FreeBSD__)
 #include <sys/socket.h>
 #elif defined(__linux__)
@@ -42,7 +42,7 @@
 #else
 #error Unknown sendfile() implementation
 #endif
-#endif /* HAVE_SENDFILE */
+#endif /* SENDFILE_WORKS */
 
 #include <errno.h>
 #include <stdio.h>
@@ -142,7 +142,7 @@ WRK_Write(struct worker *w, const void *ptr, int len)
        return (len);
 }
 
-#ifdef HAVE_SENDFILE
+#ifdef SENDFILE_WORKS
 void
 WRK_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
 {
@@ -174,7 +174,7 @@ WRK_Sendfile(struct worker *w, int fd, off_t off, unsigned len)
 #error Unknown sendfile() implementation
 #endif
 }
-#endif /* HAVE_SENDFILE */
+#endif /* SENDFILE_WORKS */
 
 /*--------------------------------------------------------------------*/
 
index 5831a1356767637f8f10597af9df723ec1fef8c8..aa4021f80d1c7f8e4350465064f0e13cf125e348 100644 (file)
@@ -150,7 +150,7 @@ RES_WriteObj(struct sess *sp)
                        CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
                        u += st->len;
                        sp->wrk->acct.bodybytes += st->len;
-#ifdef HAVE_SENDFILE
+#ifdef SENDFILE_WORKS
                        /*
                         * XXX: the overhead of setting up sendfile is not
                         * XXX: epsilon and maybe not even delta, so avoid
@@ -164,7 +164,7 @@ RES_WriteObj(struct sess *sp)
                                    st->where, st->len);
                                continue;
                        }
-#endif /* HAVE_SENDFILE */
+#endif /* SENDFILE_WORKS */
                        VSL_stats->n_objwrite++;
                        WRK_Write(sp->wrk, st->ptr, st->len);
                }
index 7957010113f57583462628f3b2ceadde3c0d9329..e0e763c60efc263488fb8385f3648ab2c77efc4d 100644 (file)
@@ -98,7 +98,7 @@ struct params {
        /* Fetcher hints */
        unsigned                fetch_chunksize;
 
-#ifdef HAVE_SENDFILE
+#ifdef SENDFILE_WORKS
        /* Sendfile object minimum size */
        unsigned                sendfile_threshold;
 #endif
index c29eb86f3e6e5205136e1abfc926de80bab42656..f850f0ff46e27950b23640bcbbe206db51f2df69 100644 (file)
@@ -371,7 +371,7 @@ tweak_fetch_chunksize(struct cli *cli, struct parspec *par, const char *arg)
            4, UINT_MAX / 1024);
 }
 
-#ifdef HAVE_SENDFILE
+#ifdef SENDFILE_WORKS
 /*--------------------------------------------------------------------*/
 
 static void
@@ -381,7 +381,7 @@ tweak_sendfile_threshold(struct cli *cli, struct parspec *par, const char *arg)
        (void)par;
        tweak_generic_uint(cli, &master.sendfile_threshold, arg, 0, UINT_MAX);
 }
-#endif /* HAVE_SENDFILE */
+#endif /* SENDFILE_WORKS */
 
 /*--------------------------------------------------------------------*/
 
@@ -699,12 +699,12 @@ static struct parspec parspec[] = {
                "above 128kb a dubious idea.",
                EXPERIMENTAL,
                "128", "kilobytes" },
-#ifdef HAVE_SENDFILE
+#ifdef SENDFILE_WORKS
        { "sendfile_threshold", tweak_sendfile_threshold,
                "The minimum size of objects transmitted with sendfile.",
                EXPERIMENTAL,
                "-1", "bytes" },
-#endif /* HAVE_SENDFILE */
+#endif /* SENDFILE_WORKS */
        { "vcl_trace", tweak_vcl_trace,
                "Trace VCL execution in the shmlog.\n"
                "Enabling this will allow you to see the path each "
index 3ea79a27be19e87461ed7460375faef7b9e56e47..53263c70b8528a7893ddb3f233789e8113836149 100644 (file)
@@ -103,18 +103,30 @@ AC_CHECK_FUNCS([strptime])
 AC_CHECK_FUNCS([fmtcheck])
 AC_CHECK_FUNCS([getdtablesize])
 
-# Don't look for sendfile at all, none of them work
-# anyway. (don't tell when done with passed mem-range)
-#
 ## This one is tricky, there are multiple versions
-#case $host in
-#*-*-freebsd*|*-*-linux*)
-#      AC_CHECK_FUNCS([sendfile])
-#      ;;
-#*)
-#      AC_MSG_WARN([won't look for sendfile() on $host])
-#      ;;
-#esac
+case $host in
+*-*-freebsd*)
+       AC_CACHE_CHECK([whether sendfile works],
+         [ac_cv_so_sendfile_works],
+         [AC_RUN_IFELSE(
+           [AC_LANG_PROGRAM([[
+       #include <sys/types.h>
+       #include <sys/socket.h>
+       #include <sys/uio.h>
+           ]],[[
+               return (SF_SYNC == 0);
+           ]])],
+           [ac_cv_so_sendfile_works=yes],
+           [ac_cv_so_sendfile_works=no])
+         ])
+       if test "$ac_cv_so_sendfile_works" = yes; then
+          AC_DEFINE([SENDFILE_WORKS], [1], [Define if SENDFILE works])
+       fi
+       ;;
+*)
+       AC_MSG_WARN([won't look for sendfile() on $host])
+       ;;
+esac
 
 # These functions are provided by libcompat on platforms where they
 # are not available