[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [libmicrohttpd] 02/02: Implemented usage of readahead buffe
From: |
gnunet |
Subject: |
[GNUnet-SVN] [libmicrohttpd] 02/02: Implemented usage of readahead buffer for sendfile() on FreeBSD 11 and later |
Date: |
Sun, 01 Oct 2017 23:53:41 +0200 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 41eb046c9c1ebb6fdcad0417eccc998d9939eceb
Author: Evgeny Grin <address@hidden>
AuthorDate: Mon Oct 2 00:44:30 2017 +0300
Implemented usage of readahead buffer for sendfile() on FreeBSD 11 and later
---
src/microhttpd/connection.c | 58 +++++++++++++++++++++++++++++++++++++++++++--
src/microhttpd/connection.h | 9 +++++++
src/microhttpd/daemon.c | 3 +++
3 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index 30ad1829..c33d484a 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -118,6 +118,54 @@
/**
+ * sendfile() chuck size
+ */
+#define MHD_SENFILE_CHUNK_ (0x20000)
+
+/**
+ * sendfile() chuck size for thread-per-connection
+ */
+#define MHD_SENFILE_CHUNK_THR_P_C_ (0x200000)
+
+#ifdef HAVE_FREEBSD_SENDFILE
+#ifdef SF_FLAGS
+/**
+ * FreeBSD sendfile() flags
+ */
+static int freebsd_sendfile_flags_;
+
+/**
+ * FreeBSD sendfile() flags for thread-per-connection
+ */
+static int freebsd_sendfile_flags_thd_p_c_;
+#endif /* SF_FLAGS */
+/**
+ * Initialises static variables
+ */
+void
+MHD_conn_init_static_ (void)
+{
+/* FreeBSD 11 and later allow to specify read-ahead size
+ * and handles SF_NODISKIO differently.
+ * SF_FLAGS defined only on FreeBSD 11 and later. */
+#ifdef SF_FLAGS
+ long sys_page_size = sysconf (_SC_PAGESIZE);
+ if (0 > sys_page_size)
+ { /* Failed to get page size. */
+ freebsd_sendfile_flags_ = SF_NODISKIO;
+ freebsd_sendfile_flags_thd_p_c_ = SF_NODISKIO;
+ }
+ else
+ {
+ freebsd_sendfile_flags_ =
+ SF_FLAGS((uint16_t)(MHD_SENFILE_CHUNK_ / sys_page_size),
SF_NODISKIO);
+ freebsd_sendfile_flags_thd_p_c_ =
+ SF_FLAGS((uint16_t)(MHD_SENFILE_CHUNK_THR_P_C_ / sys_page_size),
SF_NODISKIO);
+ }
+#endif /* SF_FLAGS */
+}
+#endif /* HAVE_FREEBSD_SENDFILE */
+/**
* Callback for receiving data from the socket.
*
* @param connection the MHD connection structure
@@ -252,9 +300,10 @@ sendfile_adapter (struct MHD_Connection *connection)
#endif /* HAVE_LINUX_SENDFILE */
#ifdef HAVE_FREEBSD_SENDFILE
off_t sent_bytes;
+ int flags = 0;
#endif
const bool used_thr_p_c = (0 != (connection->daemon->options &
MHD_USE_THREAD_PER_CONNECTION));
- const size_t chunk_size = used_thr_p_c ? 0x200000 : 0x20000;
+ const size_t chunk_size = used_thr_p_c ? MHD_SENFILE_CHUNK_THR_P_C_ :
MHD_SENFILE_CHUNK_;
size_t send_size = 0;
mhd_assert (MHD_resp_sender_sendfile == connection->resp_sender);
@@ -311,13 +360,17 @@ sendfile_adapter (struct MHD_Connection *connection)
connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
#endif /* EPOLL_SUPPORT */
#elif defined(HAVE_FREEBSD_SENDFILE)
+#ifdef SF_FLAGS
+ flags = used_thr_p_c ?
+ freebsd_sendfile_flags_thd_p_c_ : freebsd_sendfile_flags_;
+#endif /* SF_FLAGS */
if (0 != sendfile (file_fd,
connection->socket_fd,
(off_t) offsetu64,
send_size,
NULL,
&sent_bytes,
- 0))
+ flags))
{
const int err = MHD_socket_get_error_();
if (MHD_SCKT_ERR_IS_EAGAIN_(err) ||
@@ -336,6 +389,7 @@ sendfile_adapter (struct MHD_Connection *connection)
return MHD_ERR_AGAIN_;
}
mhd_assert (0 < sent_bytes);
+ mhd_assert (SSIZE_MAX >= sent_bytes);
ret = (ssize_t)sent_bytes;
#endif /* HAVE_FREEBSD_SENDFILE */
return ret;
diff --git a/src/microhttpd/connection.h b/src/microhttpd/connection.h
index 37e4d550..a9df9998 100644
--- a/src/microhttpd/connection.h
+++ b/src/microhttpd/connection.h
@@ -62,6 +62,15 @@
#define MHD_ERR_INVAL_ (-3078)
+#ifdef HAVE_FREEBSD_SENDFILE
+/**
+ * Initialises static variables
+ */
+void
+MHD_conn_init_static_ (void);
+#endif /* HAVE_FREEBSD_SENDFILE */
+
+
/**
* Set callbacks for this connection to those for HTTP.
*
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 3bf151bb..8a9c74e7 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -6702,6 +6702,9 @@ MHD_init(void)
gnutls_global_init ();
#endif /* HTTPS_SUPPORT */
MHD_monotonic_sec_counter_init();
+#ifdef HAVE_FREEBSD_SENDFILE
+ MHD_conn_init_static_ ();
+#endif /* HAVE_FREEBSD_SENDFILE */
}
--
To stop receiving notification emails like this one, please contact
address@hidden