libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 699b6cd5636ef7ce2e41b42301fc1b56f9a02f8e
parent 571ec180781a55a63007d97bad9755265b282ebf
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Thu, 20 Oct 2022 19:21:52 +0300

Added new state for MHD_ConnectionEventLoopInfo

Diffstat:
Msrc/microhttpd/connection.c | 2+-
Msrc/microhttpd/daemon.c | 24++++++++++++++----------
Msrc/microhttpd/internal.h | 7+++++++
3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c @@ -5278,7 +5278,7 @@ MHD_connection_epoll_update_ (struct MHD_Connection *connection) (0 == (connection->epoll_state & MHD_EPOLL_STATE_SUSPENDED)) && ( ( (MHD_EVENT_LOOP_INFO_WRITE == connection->event_loop_info) && (0 == (connection->epoll_state & MHD_EPOLL_STATE_WRITE_READY))) || - ( (MHD_EVENT_LOOP_INFO_READ == connection->event_loop_info) && + ( (0 != (MHD_EVENT_LOOP_INFO_READ & connection->event_loop_info)) && (0 == (connection->epoll_state & MHD_EPOLL_STATE_READ_READY)) ) ) ) { /* add to epoll set */ diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -985,6 +985,7 @@ internal_get_fdset2 (struct MHD_Daemon *daemon, switch (pos->event_loop_info) { case MHD_EVENT_LOOP_INFO_READ: + case MHD_EVENT_LOOP_INFO_PROCESS_READ: if (! MHD_add_to_fd_set_ (pos->socket_fd, read_fd_set, max_fd, @@ -1181,7 +1182,7 @@ call_handlers (struct MHD_Connection *con, if (con->tls_read_ready) read_ready = true; #endif /* HTTPS_SUPPORT */ - if ( (MHD_EVENT_LOOP_INFO_READ == con->event_loop_info) && + if ( (0 != (MHD_EVENT_LOOP_INFO_READ & con->event_loop_info)) && (read_ready || (force_close && con->sk_nonblck)) ) { MHD_connection_handle_read (con, force_close); @@ -1255,11 +1256,11 @@ call_handlers (struct MHD_Connection *con, if ( (! con->daemon->data_already_pending) && (0 == (con->daemon->options & MHD_USE_THREAD_PER_CONNECTION)) ) { - if (MHD_EVENT_LOOP_INFO_BLOCK == con->event_loop_info) + if (0 != (MHD_EVENT_LOOP_INFO_BLOCK & con->event_loop_info)) con->daemon->data_already_pending = true; #ifdef HTTPS_SUPPORT else if ( (con->tls_read_ready) && - (MHD_EVENT_LOOP_INFO_READ == con->event_loop_info) ) + (0 != (MHD_EVENT_LOOP_INFO_READ & con->event_loop_info)) ) con->daemon->data_already_pending = true; #endif /* HTTPS_SUPPORT */ } @@ -1985,13 +1986,13 @@ thread_main_handle_connection (void *data) was_suspended = false; } - use_zero_timeout = ( (MHD_EVENT_LOOP_INFO_BLOCK == con->event_loop_info) + use_zero_timeout = + (0 != (MHD_EVENT_LOOP_INFO_BLOCK & con->event_loop_info) #ifdef HTTPS_SUPPORT - || ( (con->tls_read_ready) && \ - (MHD_EVENT_LOOP_INFO_READ == - con->event_loop_info) ) + || ( (con->tls_read_ready) && + (0 != (MHD_EVENT_LOOP_INFO_READ & con->event_loop_info)) ) #endif /* HTTPS_SUPPORT */ - ); + ); if (! use_poll) { /* use select */ @@ -2027,6 +2028,7 @@ thread_main_handle_connection (void *data) switch (con->event_loop_info) { case MHD_EVENT_LOOP_INFO_READ: + case MHD_EVENT_LOOP_INFO_PROCESS_READ: if (! MHD_add_to_fd_set_ (con->socket_fd, &rs, &maxsock, @@ -2133,6 +2135,7 @@ thread_main_handle_connection (void *data) switch (con->event_loop_info) { case MHD_EVENT_LOOP_INFO_READ: + case MHD_EVENT_LOOP_INFO_PROCESS_READ: p[0].events |= POLLIN | MHD_POLL_EVENTS_ERR_DISC; break; case MHD_EVENT_LOOP_INFO_WRITE: @@ -4750,6 +4753,7 @@ MHD_poll_all (struct MHD_Daemon *daemon, switch (pos->event_loop_info) { case MHD_EVENT_LOOP_INFO_READ: + case MHD_EVENT_LOOP_INFO_PROCESS_READ: p[poll_server + i].events |= POLLIN | MHD_POLL_EVENTS_ERR_DISC; break; case MHD_EVENT_LOOP_INFO_WRITE: @@ -5362,7 +5366,7 @@ MHD_epoll (struct MHD_Daemon *daemon, if (0 != (events[i].events & EPOLLIN)) { pos->epoll_state |= MHD_EPOLL_STATE_READ_READY; - if ( ( (MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info) || + if ( ( (0 != (MHD_EVENT_LOOP_INFO_READ & pos->event_loop_info)) || (pos->read_buffer_size > pos->read_buffer_offset) ) && (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL) ) ) { @@ -5452,7 +5456,7 @@ MHD_epoll (struct MHD_Daemon *daemon, (pos->epoll_state & (MHD_EPOLL_STATE_SUSPENDED | MHD_EPOLL_STATE_IN_EREADY_EDLL))) { - if ( ((MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info) && + if ( ((0 != (MHD_EVENT_LOOP_INFO_READ & pos->event_loop_info)) && (0 == (pos->epoll_state & MHD_EPOLL_STATE_READ_READY)) ) || ((MHD_EVENT_LOOP_INFO_WRITE == pos->event_loop_info) && (0 == (pos->epoll_state & MHD_EPOLL_STATE_WRITE_READY)) ) || diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h @@ -227,6 +227,13 @@ enum MHD_ConnectionEventLoopInfo MHD_EVENT_LOOP_INFO_BLOCK = 1 << 2, /** + * Some data is ready to be processed, but more data could + * be read. + */ + MHD_EVENT_LOOP_INFO_PROCESS_READ = + MHD_EVENT_LOOP_INFO_READ | MHD_EVENT_LOOP_INFO_BLOCK, + + /** * We are finished and are awaiting cleanup. */ MHD_EVENT_LOOP_INFO_CLEANUP = 1 << 3