changed the writability checker to use poll() to handle a high file descroptor in httpd-std.c.

added server.backlog-size option for httpd servers
This commit is contained in:
2017-01-25 05:28:02 +00:00
parent cf0956cad6
commit 1fffa0324e
6 changed files with 57 additions and 14 deletions

View File

@ -109,6 +109,9 @@
# if defined(HAVE_SYS_EPOLL_H)
# include <sys/epoll.h>
# endif
# if defined(HAVE_SYS_POLL_H)
# include <sys/poll.h>
# endif
# if defined(__linux__)
# include <limits.h>
# if defined(HAVE_LINUX_NETFILTER_IPV4_H)
@ -1044,7 +1047,8 @@ bind_ok:
}
}
if (listen (fd, 10) <= -1)
HTTPD_DBGOUT1 ("Setting backlog size to %d\n", server->dope.backlog_size);
if (listen (fd, server->dope.backlog_size) <= -1)
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
@ -1087,7 +1091,7 @@ static int server_accept (
#if 0
/* TODO: implement maximum number of client per server??? */
if (fd >= FD_SETSIZE)
if (fd >= FD_SETSIZE - 1)
{
HTTPD_DEBUG ("ERROR: too many client - max %d, fd %d\n", (FD_SETSIZE, fd));
/*TODO: qse_httpd_seterrnum (httpd, QSE_HTTPD_EXXXXX);*/
@ -1857,10 +1861,27 @@ static int mux_writable (qse_httpd_t* httpd, qse_httpd_hnd_t handle, const qse_n
tv = tmout? QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec): -1;
return os2_select (&handle, 0, 1, 0, tv);
#elif defined(HAVE_SYS_POLL_H)
struct pollfd p;
int tv;
p.fd = handle;
p.events = POLLOUT;
p.revents = 0;
tv = tmout? QSE_SECNSEC_TO_MSEC(tmout->sec, tmout->nsec): -1;
return poll (&p, 1, tv);
#else
fd_set w;
struct timeval tv, * tvp;
#if defined(FD_SETSIZE)
/* NOTE: when the handle exceeds FD_SETSIZE,
* select() may screw the entire program. */
if (handle >= FD_SETSIZE - 1) return -1;
#endif
FD_ZERO (&w);
FD_SET (handle, &w);

View File

@ -31,7 +31,6 @@
#include <qse/cmn/mbwc.h>
#include <qse/si/sio.h>
#if !defined(QSE_HTTPD_DEFAULT_MODPREFIX)
# if defined(_WIN32)
# define QSE_HTTPD_DEFAULT_MODPREFIX "qsehttpd-"
@ -1673,6 +1672,7 @@ static int invoke_client_task (
qse_ntime_t tmout;
tmout.sec = 0;
tmout.nsec = 0;
if (httpd->opt.scb.mux.writable (httpd, client->handle, &tmout) <= 0)
{
/* it is not writable yet. so just skip
@ -1732,7 +1732,6 @@ static int perform_client_task (
else
{
/* locate an active client to the tail of the client list */
qse_gettime (&client->last_active); /* TODO: error check??? */
move_client_to_tail (httpd, client);