gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [libmicrohttpd] 01/02: Prevent calling of MHD_get_fdset() a


From: gnunet
Subject: [GNUnet-SVN] [libmicrohttpd] 01/02: Prevent calling of MHD_get_fdset() and MHD_get_fdset2() for daemons with MHD_USE_INTERNAL_POLLING_THREAD, maintain backward compatibility
Date: Tue, 14 Mar 2017 22:54:06 +0100

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

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit 4c219bf5c0d4685cb00fd7ce19dd871348b67833
Author: Evgeny Grin (Karlson2k) <address@hidden>
AuthorDate: Tue Mar 14 23:55:16 2017 +0300

    Prevent calling of MHD_get_fdset() and MHD_get_fdset2() for daemons with 
MHD_USE_INTERNAL_POLLING_THREAD,
    maintain backward compatibility
---
 src/include/microhttpd.h |   9 ++++
 src/microhttpd/daemon.c  | 129 +++++++++++++++++++++++++++++++++--------------
 2 files changed, 100 insertions(+), 38 deletions(-)

diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h
index c887b714..027e4513 100644
--- a/src/include/microhttpd.h
+++ b/src/include/microhttpd.h
@@ -2153,6 +2153,9 @@ MHD_add_connection (struct MHD_Daemon *daemon,
  * before calling this function. FD_SETSIZE is assumed
  * to be platform's default.
  *
+ * This function could be called only for daemon started
+ * without MHD_USE_INTERNAL_POLLING_THREAD flag.
+ *
  * @param daemon daemon to get sets from
  * @param read_fd_set read set
  * @param write_fd_set write set
@@ -2181,6 +2184,9 @@ MHD_get_fdset (struct MHD_Daemon *daemon,
  * as @a fd_setsize allow usage of larger/smaller than
  * platform's default fd_sets.
  *
+ * This function could be called only for daemon started
+ * without MHD_USE_INTERNAL_POLLING_THREAD flag.
+ *
  * @param daemon daemon to get sets from
  * @param read_fd_set read set
  * @param write_fd_set write set
@@ -2210,6 +2216,9 @@ MHD_get_fdset2 (struct MHD_Daemon *daemon,
  * before calling this function. Size of fd_set is
  * determined by current value of FD_SETSIZE.
  *
+ * This function could be called only for daemon started
+ * without MHD_USE_INTERNAL_POLLING_THREAD flag.
+ *
  * @param daemon daemon to get sets from
  * @param read_fd_set read set
  * @param write_fd_set write set
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 6a112546..e5384c59 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -889,13 +889,9 @@ urh_from_pollfd(struct MHD_UpgradeResponseHandle *urh,
 }
 #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
 
+
 /**
- * Obtain the `select()` sets for this daemon.
- * Daemon's FDs will be added to fd_sets. To get only
- * daemon FDs in fd_sets, call FD_ZERO for each fd_set
- * before calling this function. Passing custom FD_SETSIZE
- * as @a fd_setsize allow usage of larger/smaller than
- * platform's default fd_sets.
+ * Internal version of #MHD_get_fdset2().
  *
  * @param daemon daemon to get sets from
  * @param read_fd_set read set
@@ -904,44 +900,27 @@ urh_from_pollfd(struct MHD_UpgradeResponseHandle *urh,
  * @param max_fd increased to largest FD added (if larger
  *               than existing value); can be NULL
  * @param fd_setsize value of FD_SETSIZE
- * @return #MHD_YES on success, #MHD_NO if this
- *         daemon was not started with the right
- *         options for this call or any FD didn't
+ * @return #MHD_YES on success, #MHD_NO if any FD didn't
  *         fit fd_set.
  * @ingroup event
  */
 int
-MHD_get_fdset2 (struct MHD_Daemon *daemon,
-               fd_set *read_fd_set,
-               fd_set *write_fd_set,
-               fd_set *except_fd_set,
-               MHD_socket *max_fd,
-               unsigned int fd_setsize)
+internal_get_fdset2 (struct MHD_Daemon *daemon,
+                     fd_set *read_fd_set,
+                     fd_set *write_fd_set,
+                     fd_set *except_fd_set,
+                     MHD_socket *max_fd,
+                     unsigned int fd_setsize)
+
 {
   struct MHD_Connection *pos;
   struct MHD_Connection *posn;
   int result = MHD_YES;
   MHD_socket ls;
 
-  if ( (NULL == daemon) ||
-       (NULL == read_fd_set) ||
-       (NULL == write_fd_set) ||
-       (daemon->shutdown) ||
-       (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ||
-       (0 != (daemon->options & MHD_USE_POLL)))
+  if (daemon->shutdown)
     return MHD_NO;
-#ifdef EPOLL_SUPPORT
-  if (0 != (daemon->options & MHD_USE_EPOLL))
-    {
-      /* we're in epoll mode, use the epoll FD as a stand-in for
-        the entire event set */
 
-      return MHD_add_to_fd_set_ (daemon->epoll_fd,
-                                 read_fd_set,
-                                 max_fd,
-                                 fd_setsize) ? MHD_YES : MHD_NO;
-    }
-#endif
   ls = daemon->listen_fd;
   if ( (MHD_INVALID_SOCKET != ls) &&
        (! daemon->was_quiesced) &&
@@ -1043,6 +1022,80 @@ MHD_get_fdset2 (struct MHD_Daemon *daemon,
 
 
 /**
+ * Obtain the `select()` sets for this daemon.
+ * Daemon's FDs will be added to fd_sets. To get only
+ * daemon FDs in fd_sets, call FD_ZERO for each fd_set
+ * before calling this function. Passing custom FD_SETSIZE
+ * as @a fd_setsize allow usage of larger/smaller than
+ * platform's default fd_sets.
+ *
+ * This function could be called only for daemon started
+ * without MHD_USE_INTERNAL_POLLING_THREAD flag.
+ *
+ * @param daemon daemon to get sets from
+ * @param read_fd_set read set
+ * @param write_fd_set write set
+ * @param except_fd_set except set
+ * @param max_fd increased to largest FD added (if larger
+ *               than existing value); can be NULL
+ * @param fd_setsize value of FD_SETSIZE
+ * @return #MHD_YES on success, #MHD_NO if this
+ *         daemon was not started with the right
+ *         options for this call or any FD didn't
+ *         fit fd_set.
+ * @ingroup event
+ */
+int
+MHD_get_fdset2 (struct MHD_Daemon *daemon,
+               fd_set *read_fd_set,
+               fd_set *write_fd_set,
+               fd_set *except_fd_set,
+               MHD_socket *max_fd,
+               unsigned int fd_setsize)
+{
+  fd_set es;
+
+  if ( (NULL == daemon) ||
+       (NULL == read_fd_set) ||
+       (NULL == write_fd_set) ||
+       (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) ||
+       (0 != (daemon->options & MHD_USE_POLL)))
+    return MHD_NO;
+
+  if (NULL == except_fd_set)
+    { /* Workaround to maintain backward compatibility. */
+#ifdef HAVE_MESSAGES
+      MHD_DLOG (daemon,
+                _("MHD_get_fdset2() called with except_fd_set "
+                  "set to NULL. Such behavior is unsupported.\n"));
+#endif
+      except_fd_set = es;
+      FD_ZERO(except_fd_set);
+    }
+
+#ifdef EPOLL_SUPPORT
+  if (0 != (daemon->options & MHD_USE_EPOLL))
+    {
+      if (daemon->shutdown)
+        return MHD_NO;
+
+      /* we're in epoll mode, use the epoll FD as a stand-in for
+         the entire event set */
+
+      return MHD_add_to_fd_set_ (daemon->epoll_fd,
+                                 read_fd_set,
+                                 max_fd,
+                                 fd_setsize) ? MHD_YES : MHD_NO;
+    }
+#endif
+
+  return internal_get_fdset2 (daemon, read_fd_set,
+                              write_fd_set, except_fd_set,
+                              max_fd, fd_setsize);
+}
+
+
+/**
  * Call the handlers for a connection in the appropriate order based
  * on the readiness as detected by the event loop.
  *
@@ -3397,12 +3450,12 @@ MHD_select (struct MHD_Daemon *daemon,
 
       /* single-threaded, go over everything */
       if (MHD_NO ==
-          MHD_get_fdset2 (daemon,
-                          &rs,
-                          &ws,
-                          &es,
-                          &maxsock,
-                          FD_SETSIZE))
+          internal_get_fdset2 (daemon,
+                               &rs,
+                               &ws,
+                               &es,
+                               &maxsock,
+                               FD_SETSIZE))
         {
 #ifdef HAVE_MESSAGES
         MHD_DLOG (daemon,

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



reply via email to

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