Ver Fonte

MHD_stop_daemon(): do not shutdown listen socket before setting shutdown flag

Evgeny Grin (Karlson2k) há 8 anos atrás
pai
commit
d8a32e84af
1 ficheiros alterados com 20 adições e 8 exclusões
  1. 20 8
      src/microhttpd/daemon.c

+ 20 - 8
src/microhttpd/daemon.c

@@ -6239,12 +6239,6 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
   else
     fd = daemon->listen_fd;
 
-  if (MHD_INVALID_SOCKET != fd)
-    {
-      (void) shutdown (fd,
-                       SHUT_RDWR);
-    }
-
   if (NULL != daemon->worker_pool)
     { /* Master daemon with worker pool. */
       mhd_assert (1 < daemon->worker_pool_size);
@@ -6262,6 +6256,13 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
           else
             mhd_assert (MHD_INVALID_SOCKET != fd);
         }
+#ifdef HAVE_LISTEN_SHUTDOWN
+      if (MHD_INVALID_SOCKET != fd)
+        {
+          (void) shutdown (fd,
+                           SHUT_RDWR);
+        }
+#endif /* HAVE_LISTEN_SHUTDOWN */
       for (i = 0; i < daemon->worker_pool_size; ++i)
         {
           MHD_stop_daemon (&daemon->worker_pool[i]);
@@ -6292,7 +6293,18 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
                     MHD_PANIC (_("Failed to signal shutdown via inter-thread communication channel"));
                 }
               else
-                mhd_assert (MHD_INVALID_SOCKET != fd);
+                {
+#ifdef HAVE_LISTEN_SHUTDOWN
+                  if (MHD_INVALID_SOCKET != fd)
+                    {
+                      if (NULL == daemon->master)
+                        (void) shutdown (fd,
+                                         SHUT_RDWR);
+                    }
+                  else
+#endif /* HAVE_LISTEN_SHUTDOWN */
+                    mhd_assert (false); /* Should never happen */
+                }
 
               if (! MHD_join_thread_ (daemon->pid.handle))
                 {
@@ -6303,7 +6315,7 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
         }
       else
         {
-          /* Internal threads are not used polling sockets. */
+          /* No internal threads are used for polling sockets. */
           close_all_connections (daemon);
         }
       if (MHD_ITC_IS_VALID_ (daemon->itc))