gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [libmicrohttpd] 01/02: daemon.c: refactoring of MHD_stop_da


From: gnunet
Subject: [GNUnet-SVN] [libmicrohttpd] 01/02: daemon.c: refactoring of MHD_stop_daemon() for clarity and readability. Added some asserts.
Date: Sun, 29 Oct 2017 21:36:42 +0100

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

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

commit a4320556aa74cab71188150015153bd0cb663616
Author: Evgeny Grin (Karlson2k) <address@hidden>
AuthorDate: Sun Oct 29 22:46:56 2017 +0300

    daemon.c: refactoring of MHD_stop_daemon() for clarity and readability.
    Added some asserts.
---
 src/microhttpd/daemon.c | 198 ++++++++++++++++++++++++------------------------
 1 file changed, 98 insertions(+), 100 deletions(-)

diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 81ed33af..7b651259 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -2666,7 +2666,7 @@ resume_suspended_connections (struct MHD_Daemon *daemon)
   struct MHD_Connection *prev = NULL;
   int ret;
   const bool used_thr_p_c = (0 != (daemon->options & 
MHD_USE_THREAD_PER_CONNECTION));
-  assert (NULL == daemon->worker_pool);
+  mhd_assert (NULL == daemon->worker_pool);
 
   ret = MHD_NO;
   MHD_mutex_lock_chk_ (&daemon->cleanup_connection_mutex);
@@ -6089,7 +6089,8 @@ close_all_connections (struct MHD_Daemon *daemon)
   struct MHD_UpgradeResponseHandle *urhn;
   const bool used_tls = (0 != (daemon->options & MHD_USE_TLS));
 
-  assert (NULL == daemon->worker_pool);
+  mhd_assert (NULL == daemon->worker_pool);
+  mhd_assert (daemon->shutdown);
   /* give upgraded HTTPS connections a chance to finish */
   /* 'daemon->urh_head' is not used in thread-per-connection mode. */
   for (urh = daemon->urh_tail; NULL != urh; urh = urhn)
@@ -6232,129 +6233,126 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
   if (NULL == daemon)
     return;
 
-  if ( (0 != (MHD_TEST_ALLOW_SUSPEND_RESUME & daemon->options)) &&
-       (NULL == daemon->worker_pool) )
-    resume_suspended_connections (daemon);
-
   daemon->shutdown = true;
-  fd = daemon->listen_fd;
+  if (daemon->was_quiesced)
+    fd = MHD_INVALID_SOCKET; /* Do not use FD if daemon was quiesced */
+  else
+    fd = daemon->listen_fd;
 
-  if (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD))
+  if (MHD_INVALID_SOCKET != fd)
     {
-      /* Separate thread(s) is used for select()/poll()/etc. */
-      if (NULL != daemon->worker_pool)
+      (void) shutdown (fd,
+                       SHUT_RDWR);
+    }
+
+  if (NULL != daemon->worker_pool)
+    { /* Master daemon with worker pool. */
+      mhd_assert (1 < daemon->worker_pool_size);
+      mhd_assert (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD));
+
+      /* Let workers shutdown in parallel. */
+      for (i = 0; i < daemon->worker_pool_size; ++i)
         {
-          /* Pool of workers is used.  */
-          /* Initiate shutdown process in wokers. */
-          for (i = 0; i < daemon->worker_pool_size; ++i)
+          daemon->worker_pool[i].shutdown = true;
+          if (MHD_ITC_IS_VALID_(daemon->worker_pool[i].itc))
             {
-              daemon->worker_pool[i].shutdown = true;
-              if (MHD_ITC_IS_VALID_(daemon->worker_pool[i].itc))
-                {
-                  if (! MHD_itc_activate_ (daemon->worker_pool[i].itc, "e"))
-                    MHD_PANIC (_("Failed to signal shutdown via inter-thread 
communication channel."));
-                }
-#ifdef HAVE_LISTEN_SHUTDOWN
-              else if (MHD_INVALID_SOCKET != fd)
-                {
-                  /* fd might be MHD_INVALID_SOCKET here due to 
'MHD_quiesce_daemon' */
-                  /* No problem if shutdown will be called several times for 
the same socket. */
-                    (void) shutdown (fd,
-                                     SHUT_RDWR);
-                }
-#endif
+              if (! MHD_itc_activate_ (daemon->worker_pool[i].itc, "e"))
+                MHD_PANIC (_("Failed to signal shutdown via inter-thread 
communication channel."));
             }
-          /* Start harvesting. */
-          for (i = 0; i < daemon->worker_pool_size; ++i)
-            {
-              if (! MHD_join_thread_ (daemon->worker_pool[i].pid.handle))
-                MHD_PANIC (_("Failed to join a thread\n"));
+          else
+            mhd_assert (MHD_INVALID_SOCKET != fd);
+        }
+      for (i = 0; i < daemon->worker_pool_size; ++i)
+        {
+          MHD_stop_daemon (&daemon->worker_pool[i]);
+        }
+      free (daemon->worker_pool);
+      mhd_assert (MHD_ITC_IS_INVALID_(daemon->itc));
 #ifdef EPOLL_SUPPORT
-              if (-1 != daemon->worker_pool[i].epoll_fd)
-                MHD_fd_close_chk_ (daemon->worker_pool[i].epoll_fd);
+      mhd_assert (-1 == daemon->epoll_fd);
 #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
-              if (-1 != daemon->worker_pool[i].epoll_upgrade_fd)
-                MHD_fd_close_chk_ (daemon->worker_pool[i].epoll_upgrade_fd);
+      mhd_assert (-1 == daemon->epoll_upgrade_fd);
 #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
-#endif
-              if (MHD_ITC_IS_VALID_ (daemon->worker_pool[i].itc) )
-                MHD_itc_destroy_chk_ (daemon->worker_pool[i].itc);
-              MHD_mutex_destroy_chk_ 
(&daemon->worker_pool[i].cleanup_connection_mutex);
+#endif /* EPOLL_SUPPORT */
+    }
+  else
+    { /* Worker daemon or single daemon. */
+      if (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD))
+        { /* Worker daemon or single daemon with internal thread(s). */
+          mhd_assert (0 == daemon->worker_pool_size);
+          if (0 != (MHD_TEST_ALLOW_SUSPEND_RESUME & daemon->options))
+            resume_suspended_connections (daemon);
+
+          if (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD))
+            {
+              /* Separate thread(s) is used for polling sockets. */
+              if (MHD_ITC_IS_VALID_(daemon->itc))
+                {
+                  if (! MHD_itc_activate_ (daemon->itc, "e"))
+                    MHD_PANIC (_("Failed to signal shutdown via inter-thread 
communication channel"));
+                }
+              else
+                mhd_assert (MHD_INVALID_SOCKET != fd);
+
+              if (! MHD_join_thread_ (daemon->pid.handle))
+                {
+                  MHD_PANIC (_("Failed to join a thread\n"));
+                }
+              /* close_all_connections() was called in daemon thread. */
             }
-          free (daemon->worker_pool);
         }
       else
         {
-          /* Single internal thread is used for select()/poll()/etc. */
-          if (MHD_ITC_IS_VALID_(daemon->itc))
-            {
-              if (! MHD_itc_activate_ (daemon->itc, "e"))
-                MHD_PANIC (_("Failed to signal shutdown via inter-thread 
communication channel"));
-            }
-#ifdef HAVE_LISTEN_SHUTDOWN
-          else
-            {
-              /* fd might be MHD_INVALID_SOCKET here due to 
'MHD_quiesce_daemon' */
-              if ( (MHD_INVALID_SOCKET != fd) &&
-                   (! daemon->was_quiesced) )
-                (void) shutdown (fd,
-                                 SHUT_RDWR);
-            }
-#endif
-          if (! MHD_join_thread_ (daemon->pid.handle))
-            {
-              MHD_PANIC (_("Failed to join a thread\n"));
-            }
+          /* Internal threads are not used polling sockets. */
+          close_all_connections (daemon);
         }
-    }
-  else
-    {
-      /* Internal threads are not used for select()/poll()/etc. */
-      close_all_connections (daemon);
-    }
-
-  if ( (MHD_INVALID_SOCKET != fd) &&
-       (! daemon->was_quiesced) )
-    MHD_socket_close_chk_ (fd);
-
-  if (MHD_ITC_IS_VALID_ (daemon->itc))
-    MHD_itc_destroy_chk_ (daemon->itc);
+      if (MHD_ITC_IS_VALID_ (daemon->itc))
+        MHD_itc_destroy_chk_ (daemon->itc);
 
 #ifdef EPOLL_SUPPORT
-  if ( (0 != (daemon->options & MHD_USE_EPOLL)) &&
-       (-1 != daemon->epoll_fd) )
-    MHD_socket_close_chk_ (daemon->epoll_fd);
+      if ( (0 != (daemon->options & MHD_USE_EPOLL)) &&
+           (-1 != daemon->epoll_fd) )
+        MHD_socket_close_chk_ (daemon->epoll_fd);
 #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
-  if ( (0 != (daemon->options & MHD_USE_EPOLL)) &&
-       (-1 != daemon->epoll_upgrade_fd) )
-    MHD_socket_close_chk_ (daemon->epoll_upgrade_fd);
+      if ( (0 != (daemon->options & MHD_USE_EPOLL)) &&
+           (-1 != daemon->epoll_upgrade_fd) )
+        MHD_socket_close_chk_ (daemon->epoll_upgrade_fd);
 #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
-#endif
+#endif /* EPOLL_SUPPORT */
 
-  /* TLS clean up */
-#ifdef HTTPS_SUPPORT
-  if (daemon->have_dhparams)
-    {
-      gnutls_dh_params_deinit (daemon->https_mem_dhparams);
-      daemon->have_dhparams = false;
-    }
-  if (0 != (daemon->options & MHD_USE_TLS))
-    {
-      gnutls_priority_deinit (daemon->priority_cache);
-      if (daemon->x509_cred)
-        gnutls_certificate_free_credentials (daemon->x509_cred);
+      MHD_mutex_destroy_chk_ (&daemon->cleanup_connection_mutex);
     }
+
+  if (NULL == daemon->master)
+    { /* Cleanup that should be done only one time in master/single daemon.
+       * Do not perform this cleanup in worker daemons. */
+
+      if (MHD_INVALID_SOCKET != fd)
+        MHD_socket_close_chk_ (fd);
+
+      /* TLS clean up */
+#ifdef HTTPS_SUPPORT
+      if (daemon->have_dhparams)
+        {
+          gnutls_dh_params_deinit (daemon->https_mem_dhparams);
+          daemon->have_dhparams = false;
+        }
+      if (0 != (daemon->options & MHD_USE_TLS))
+        {
+          gnutls_priority_deinit (daemon->priority_cache);
+          if (daemon->x509_cred)
+            gnutls_certificate_free_credentials (daemon->x509_cred);
+        }
 #endif /* HTTPS_SUPPORT */
 
 #ifdef DAUTH_SUPPORT
-  free (daemon->nnc);
-  MHD_mutex_destroy_chk_ (&daemon->nnc_lock);
+      free (daemon->nnc);
+      MHD_mutex_destroy_chk_ (&daemon->nnc_lock);
 #endif
-  MHD_mutex_destroy_chk_ (&daemon->per_ip_connection_mutex);
-  if (NULL != daemon->worker_pool)
-    MHD_mutex_destroy_chk_ (&daemon->cleanup_connection_mutex);
+      MHD_mutex_destroy_chk_ (&daemon->per_ip_connection_mutex);
 
-  free (daemon);
+      free (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]