gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [libmicrohttpd] 02/02: Moved 'sendfile()' part from send_pa


From: gnunet
Subject: [GNUnet-SVN] [libmicrohttpd] 02/02: Moved 'sendfile()' part from send_param_adapter() to separate function
Date: Sun, 04 Jun 2017 21:33:07 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit 0a7707a81137f146d8fa7c01b60d3cf884d4665e
Author: Evgeny Grin (Karlson2k) <address@hidden>
AuthorDate: Sun Jun 4 20:44:16 2017 +0300

    Moved 'sendfile()' part from send_param_adapter() to separate function
---
 src/microhttpd/connection.c | 197 ++++++++++++++++++++++++--------------------
 1 file changed, 109 insertions(+), 88 deletions(-)

diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index bcc0f2cb..ef162278 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -178,78 +178,6 @@ send_param_adapter (struct MHD_Connection *connection,
   if (i > MHD_SCKT_SEND_MAX_SIZE_)
     i = MHD_SCKT_SEND_MAX_SIZE_; /* return value limit */
 
-#if LINUX
-  if ( (connection->write_buffer_append_offset ==
-        connection->write_buffer_send_offset) &&
-       (NULL != connection->response) &&
-       (MHD_resp_sender_sendfile == connection->resp_sender) )
-    {
-      /* can use sendfile */
-      int file_fd = connection->response->fd;
-      uint64_t left;
-      uint64_t offsetu64;
-#ifndef HAVE_SENDFILE64
-      off_t offset;
-#else  /* HAVE_SENDFILE64 */
-      off64_t offset;
-#endif /* HAVE_SENDFILE64 */
-      offsetu64 = connection->response_write_position + 
connection->response->fd_off;
-      left = connection->response->total_size - 
connection->response_write_position;
-      ret = 0;
-#ifndef HAVE_SENDFILE64
-      if ((uint64_t)OFF_T_MAX < offsetu64)
-        MHD_socket_set_error_to_ENOMEM ();
-      else
-        {
-          offset = (off_t) offsetu64;
-          ret = sendfile (connection->socket_fd,
-                          file_fd,
-                          &offset,
-                          left);
-        }
-#else  /* HAVE_SENDFILE64 */
-      if ((uint64_t)OFF64_T_MAX < offsetu64)
-        MHD_socket_set_error_to_ENOMEM ();
-      else
-        {
-          offset = (off64_t) offsetu64;
-          ret = sendfile64 (connection->socket_fd,
-                            file_fd,
-                            &offset,
-                            left);
-        }
-#endif /* HAVE_SENDFILE64 */
-      if (0 < ret)
-        {
-          /* write successful */
-#ifdef EPOLL_SUPPORT
-          if (left > (uint64_t)ret)
-            connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
-#endif /* EPOLL_SUPPORT */
-          return ret;
-        }
-      err = MHD_socket_get_error_();
-#ifdef EPOLL_SUPPORT
-      if ( (0 > ret) && (MHD_SCKT_ERR_IS_EAGAIN_(err)) )
-        {
-          /* EAGAIN --- no longer write-ready */
-          connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
-        }
-#endif
-      if (MHD_SCKT_ERR_IS_EINTR_ (err) ||
-          MHD_SCKT_ERR_IS_EAGAIN_ (err))
-        return 0;
-      if (MHD_SCKT_ERR_IS_(err,
-                           MHD_SCKT_EBADF_))
-        return -1;
-      /* sendfile() failed with EINVAL if mmap()-like operations are not
-         supported for FD or other 'unusual' errors occurred, so we should try
-         to fall back to 'SEND'; see also this thread for info on
-         odd libc/Linux behavior with sendfile:
-         http://lists.gnu.org/archive/html/libmicrohttpd/2011-02/msg00015.html 
*/
-      connection->resp_sender = MHD_resp_sender_std;
-    }
-#endif
   ret = MHD_send_ (connection->socket_fd,
                    other,
                    i);
@@ -274,6 +202,88 @@ send_param_adapter (struct MHD_Connection *connection,
 }
 
 
+#ifdef __linux__
+/**
+ * Function for sending responses backed by file FD.
+ *
+ * @param connection the MHD connection structure
+ * @return actual number of bytes sent
+ */
+static ssize_t
+sendfile_adapter (struct MHD_Connection *connection)
+{
+  int ret;
+  const int file_fd = connection->response->fd;
+  uint64_t left;
+  uint64_t offsetu64;
+#ifndef HAVE_SENDFILE64
+  off_t offset;
+#else  /* HAVE_SENDFILE64 */
+  off64_t offset;
+#endif /* HAVE_SENDFILE64 */
+  EXTRA_CHECK (MHD_resp_sender_sendfile == connection->resp_sender);
+
+  offsetu64 = connection->response_write_position + 
connection->response->fd_off;
+  left = connection->response->total_size - 
connection->response_write_position;
+  ret = 0;
+#ifndef HAVE_SENDFILE64
+  if ((uint64_t)OFF_T_MAX < offsetu64)
+    MHD_socket_set_error_to_ENOMEM ();
+  else
+    {
+      offset = (off_t) offsetu64;
+      ret = sendfile (connection->socket_fd,
+                      file_fd,
+                      &offset,
+                      left);
+    }
+#else  /* HAVE_SENDFILE64 */
+  if ((uint64_t)OFF64_T_MAX < offsetu64)
+    MHD_socket_set_error_to_ENOMEM ();
+  else
+    {
+      offset = (off64_t) offsetu64;
+      ret = sendfile64 (connection->socket_fd,
+                        file_fd,
+                        &offset,
+                        left);
+    }
+#endif /* HAVE_SENDFILE64 */
+  if (0 < ret)
+    {
+      /* write successful */
+#ifdef EPOLL_SUPPORT
+      if (left > (uint64_t)ret)
+        connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
+#endif /* EPOLL_SUPPORT */
+      return ret;
+    }
+  err = MHD_socket_get_error_();
+#ifdef EPOLL_SUPPORT
+  if ( (0 > ret) && (MHD_SCKT_ERR_IS_EAGAIN_(err)) )
+    {
+      /* EAGAIN --- no longer write-ready */
+      connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;
+    }
+#endif
+  if (MHD_SCKT_ERR_IS_EINTR_ (err) ||
+      MHD_SCKT_ERR_IS_EAGAIN_ (err))
+    return 0;
+  if (MHD_SCKT_ERR_IS_(err,
+                       MHD_SCKT_EBADF_))
+    return -1;
+  /* sendfile() failed with EINVAL if mmap()-like operations are not
+     supported for FD or other 'unusual' errors occurred, so we should try
+     to fall back to 'SEND'; see also this thread for info on
+     odd libc/Linux behavior with sendfile:
+     http://lists.gnu.org/archive/html/libmicrohttpd/2011-02/msg00015.html */
+  connection->resp_sender = MHD_resp_sender_std;
+  MHD_socket_set_error_ (MHD_SCKT_EAGAIN_);
+  return 0;
+}
+#endif /* __linux__ */
+
+
 /**
  * Check whether is possible to force push socket buffer content as
  * partial packet.
@@ -2837,24 +2847,35 @@ MHD_connection_handle_write (struct MHD_Connection 
*connection)
                 /* mutex was already unlocked by try_ready_normal_body */
                 break;
               }
-            data_write_offset = connection->response_write_position
-                                - response->data_start;
-            if (data_write_offset > (uint64_t)SIZE_MAX)
-              MHD_PANIC (_("Data offset exceeds limit"));
-            ret = connection->send_cls (connection,
-                                        &response->data
-                                        [(size_t)data_write_offset],
-                                        response->data_size -
-                                        (size_t)data_write_offset);
+#ifdef __linux__
+            if (MHD_resp_sender_sendfile == connection->resp_sender)
+              {
+                ret = sendfile_adapter (connection);
+              }
+            else
+#else  /* ! __linux__ */
+            if (1)
+#endif /* ! __linux__ */
+              {
+                data_write_offset = connection->response_write_position
+                                    - response->data_start;
+                if (data_write_offset > (uint64_t)SIZE_MAX)
+                  MHD_PANIC (_("Data offset exceeds limit"));
+                ret = connection->send_cls (connection,
+                                            &response->data
+                                            [(size_t)data_write_offset],
+                                            response->data_size -
+                                            (size_t)data_write_offset);
 #if DEBUG_SEND_DATA
-            if (ret > 0)
-              fprintf (stderr,
-                       _("Sent %d-byte DATA response: `%.*s'\n"),
-                       (int) ret,
-                       (int) ret,
-                       &response->data[connection->response_write_position -
-                                       response->data_start]);
+                if (ret > 0)
+                  fprintf (stderr,
+                           _("Sent %d-byte DATA response: `%.*s'\n"),
+                           (int) ret,
+                           (int) ret,
+                           &response->data[connection->response_write_position 
-
+                                           response->data_start]);
 #endif
+              }
             if (NULL != response->crc)
               MHD_mutex_unlock_chk_ (&response->mutex);
             if (ret < 0)

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]