[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] 10/13: Unified and simplified fd_set filling
From: |
gnunet |
Subject: |
[libmicrohttpd] 10/13: Unified and simplified fd_set filling |
Date: |
Thu, 23 Nov 2023 11:49:13 +0100 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 38e2c1faacaf061c5a56de537e64eb86bdb4928f
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Tue Nov 21 17:26:27 2023 +0300
Unified and simplified fd_set filling
---
src/microhttpd/daemon.c | 141 +++++++++++++++++++++++++++---------------------
1 file changed, 81 insertions(+), 60 deletions(-)
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 96f0411f..98a3a4c8 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -995,6 +995,7 @@ internal_get_fdset2 (struct MHD_Daemon *daemon,
struct MHD_Connection *posn;
enum MHD_Result result = MHD_YES;
MHD_socket ls;
+ bool itc_added;
#ifndef HAS_FD_SETSIZE_OVERRIDABLE
(void) fd_setsize; /* Mute compiler warning */
@@ -1004,14 +1005,37 @@ internal_get_fdset2 (struct MHD_Daemon *daemon,
if (daemon->shutdown)
return MHD_YES;
- ls = daemon->listen_fd;
- if ( (MHD_INVALID_SOCKET != ls) &&
- (! daemon->was_quiesced) &&
- (! MHD_add_to_fd_set_ (ls,
- read_fd_set,
- max_fd,
- fd_setsize)) )
- result = MHD_NO;
+ /* The order of FDs added is important for W32 sockets as W32 fd_set has
+ limits for number of added FDs instead of the limit for the higher
+ FD value. */
+
+ /* Add ITC FD first. The daemon must be able to respond on application
+ commands issued in other threads. */
+ itc_added = false;
+ if (MHD_ITC_IS_VALID_ (daemon->itc))
+ {
+ itc_added = MHD_add_to_fd_set_ (MHD_itc_r_fd_ (daemon->itc),
+ read_fd_set,
+ max_fd,
+ fd_setsize);
+ if (! itc_added)
+ result = MHD_NO;
+ }
+
+ ls = daemon->was_quiesced ? MHD_INVALID_SOCKET : daemon->listen_fd;
+ if (! itc_added &&
+ (MHD_INVALID_SOCKET != ls))
+ {
+ /* Add listen FD if ITC was not added. Listen FD could be used to signal
+ the daemon shutdown. */
+ if (MHD_add_to_fd_set_ (ls,
+ read_fd_set,
+ max_fd,
+ fd_setsize))
+ ls = MHD_INVALID_SOCKET; /* Already added */
+ else
+ result = MHD_NO;
+ }
/* Add all sockets to 'except_fd_set' as well to watch for
* out-of-band data. However, ignore errors if INFO_READ
@@ -1082,6 +1106,7 @@ internal_get_fdset2 (struct MHD_Daemon *daemon,
}
#endif /* MHD_WINSOCK_SOCKETS */
#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
+ if (1)
{
struct MHD_UpgradeResponseHandle *urh;
@@ -1098,6 +1123,21 @@ internal_get_fdset2 (struct MHD_Daemon *daemon,
}
}
#endif
+
+ if (MHD_INVALID_SOCKET != ls)
+ {
+ /* The listen socket is present and hasn't been added */
+ if ((daemon->connections < daemon->connection_limit) &&
+ ! daemon->at_limit)
+ {
+ if (! MHD_add_to_fd_set_ (ls,
+ read_fd_set,
+ max_fd,
+ fd_setsize))
+ result = MHD_NO;
+ }
+ }
+
#if _MHD_DEBUG_CONNECT
#ifdef HAVE_MESSAGES
if (NULL != max_fd)
@@ -4810,70 +4850,51 @@ MHD_select (struct MHD_Daemon *daemon,
}
else
{
+ bool itc_added;
/* accept only, have one thread per connection */
- if ( (MHD_INVALID_SOCKET != (ls = daemon->listen_fd)) &&
- (! daemon->was_quiesced) &&
- (! MHD_add_to_fd_set_ (ls,
- &rs,
- &maxsock,
- (int) FD_SETSIZE)) )
+ itc_added = false;
+ if (MHD_ITC_IS_VALID_ (daemon->itc))
{
+ itc_added = MHD_add_to_fd_set_ (MHD_itc_r_fd_ (daemon->itc),
+ &rs,
+ &maxsock,
+ (int) FD_SETSIZE);
+ if (! itc_added)
+ {
#ifdef HAVE_MESSAGES
- MHD_DLOG (daemon,
- _ ("Could not add listen socket to fdset.\n"));
+ MHD_DLOG (daemon, _ ("Could not add control inter-thread " \
+ "communication channel FD to fdset.\n"));
#endif
- return MHD_NO;
+ err_state = MHD_YES;
+ }
}
- }
- if ( (MHD_ITC_IS_VALID_ (daemon->itc)) &&
- (! MHD_add_to_fd_set_ (MHD_itc_r_fd_ (daemon->itc),
- &rs,
- &maxsock,
- (int) FD_SETSIZE)) )
- {
- bool retry_succeed;
-
- retry_succeed = false;
-#if defined(MHD_WINSOCK_SOCKETS)
- /* fdset limit reached, new connections
- cannot be handled. Remove listen socket FD
- from fdset and retry to add ITC FD. */
if ( (MHD_INVALID_SOCKET != (ls = daemon->listen_fd)) &&
(! daemon->was_quiesced) )
{
- FD_CLR (ls,
- &rs);
- if (MHD_add_to_fd_set_ (MHD_itc_r_fd_ (daemon->itc),
- &rs,
- &maxsock,
- (int) FD_SETSIZE))
- retry_succeed = true;
- }
-#endif /* MHD_WINSOCK_SOCKETS */
-
- if (! retry_succeed)
- {
+ /* Stop listening if we are at the configured connection limit */
+ /* If we're at the connection limit, no point in really
+ accepting new connections; however, make sure we do not miss
+ the shutdown OR the termination of an existing connection; so
+ only do this optimisation if we have a signaling ITC in
+ place. */
+ if (! itc_added ||
+ ((daemon->connections < daemon->connection_limit) &&
+ ! daemon->at_limit))
+ {
+ if (! MHD_add_to_fd_set_ (ls,
+ &rs,
+ &maxsock,
+ (int) FD_SETSIZE))
+ {
#ifdef HAVE_MESSAGES
- MHD_DLOG (daemon, _ ("Could not add control inter-thread " \
- "communication channel FD to fdset.\n"));
+ MHD_DLOG (daemon,
+ _ ("Could not add listen socket to fdset.\n"));
#endif
- err_state = MHD_YES;
+ err_state = MHD_YES;
+ }
+ }
}
}
- /* Stop listening if we are at the configured connection limit */
- /* If we're at the connection limit, no point in really
- accepting new connections; however, make sure we do not miss
- the shutdown OR the termination of an existing connection; so
- only do this optimization if we have a signaling ITC in
- place. */
- if ( (MHD_INVALID_SOCKET != (ls = daemon->listen_fd)) &&
- (MHD_ITC_IS_VALID_ (daemon->itc)) &&
- ( (daemon->connections == daemon->connection_limit) ||
- (daemon->at_limit) ) )
- {
- FD_CLR (ls,
- &rs);
- }
if (MHD_NO != err_state)
millisec = 0;
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [libmicrohttpd] 03/13: MHD_start_daemon(): moved daemon flags internal initialisation, (continued)
- [libmicrohttpd] 03/13: MHD_start_daemon(): moved daemon flags internal initialisation, gnunet, 2023/11/23
- [libmicrohttpd] 01/13: Added detection of more conditions to process the data without waiting, gnunet, 2023/11/23
- [libmicrohttpd] 04/13: MHD_start_daemon(): reject INTERNAL_POLLING_THREAD if threads are disabled, gnunet, 2023/11/23
- [libmicrohttpd] 02/13: MHD_quiesce_daemon(): fixed return value if already quiesced, gnunet, 2023/11/23
- [libmicrohttpd] 05/13: Moved user options counter to shorter its lifetime, gnunet, 2023/11/23
- [libmicrohttpd] 06/13: test_daemon: fixed to not skip if failed, gnunet, 2023/11/23
- [libmicrohttpd] 08/13: Improved daemon shutdown handling in external polling mode, gnunet, 2023/11/23
- [libmicrohttpd] 07/13: test_digestauth2: fixed order of the initial checks, gnunet, 2023/11/23
- [libmicrohttpd] 09/13: Micro-optimisations for non-overridable FD_SETSIZE, gnunet, 2023/11/23
- [libmicrohttpd] 13/13: Officially support zero for MHD_OPTION_THREAD_POOL_SIZE, gnunet, 2023/11/23
- [libmicrohttpd] 10/13: Unified and simplified fd_set filling,
gnunet <=
- [libmicrohttpd] 11/13: Added new daemon flag MHD_USE_NO_THREAD_SAFETY, gnunet, 2023/11/23
- [libmicrohttpd] 12/13: Tests: added use of MHD_USE_NO_THREAD_SAFETY flag, gnunet, 2023/11/23