Use select in sws, which has better cross-platform support than poll
This commit is contained in:
parent
66a77a9b49
commit
60a2ee88a5
@ -50,8 +50,6 @@
|
|||||||
#include <netinet/tcp.h> /* for TCP_NODELAY */
|
#include <netinet/tcp.h> /* for TCP_NODELAY */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <poll.h>
|
|
||||||
|
|
||||||
#define ENABLE_CURLX_PRINTF
|
#define ENABLE_CURLX_PRINTF
|
||||||
/* make the curlx header define all printf() functions to use the curlx_*
|
/* make the curlx header define all printf() functions to use the curlx_*
|
||||||
versions instead */
|
versions instead */
|
||||||
@ -117,8 +115,8 @@ struct httprequest {
|
|||||||
|
|
||||||
#define MAX_SOCKETS 1024
|
#define MAX_SOCKETS 1024
|
||||||
|
|
||||||
static struct pollfd all_sockets[MAX_SOCKETS];
|
static curl_socket_t all_sockets[MAX_SOCKETS];
|
||||||
static nfds_t num_sockets = 0;
|
static size_t num_sockets = 0;
|
||||||
|
|
||||||
static int ProcessRequest(struct httprequest *req);
|
static int ProcessRequest(struct httprequest *req);
|
||||||
static void storerequest(char *reqbuf, size_t totalsize);
|
static void storerequest(char *reqbuf, size_t totalsize);
|
||||||
@ -1770,9 +1768,7 @@ static int accept_connection(int sock)
|
|||||||
|
|
||||||
logmsg("====> Client connect");
|
logmsg("====> Client connect");
|
||||||
|
|
||||||
all_sockets[num_sockets].fd = msgsock;
|
all_sockets[num_sockets] = msgsock;
|
||||||
all_sockets[num_sockets].events = POLLIN;
|
|
||||||
all_sockets[num_sockets].revents = 0;
|
|
||||||
num_sockets += 1;
|
num_sockets += 1;
|
||||||
|
|
||||||
#ifdef TCP_NODELAY
|
#ifdef TCP_NODELAY
|
||||||
@ -1871,7 +1867,7 @@ int main(int argc, char *argv[])
|
|||||||
int arg=1;
|
int arg=1;
|
||||||
long pid;
|
long pid;
|
||||||
const char *hostport = "127.0.0.1";
|
const char *hostport = "127.0.0.1";
|
||||||
nfds_t socket_idx;
|
size_t socket_idx;
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
|
|
||||||
@ -1983,9 +1979,7 @@ int main(int argc, char *argv[])
|
|||||||
sock = socket(AF_INET6, SOCK_STREAM, 0);
|
sock = socket(AF_INET6, SOCK_STREAM, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
all_sockets[0].fd = sock;
|
all_sockets[0] = sock;
|
||||||
all_sockets[0].events = POLLIN;
|
|
||||||
all_sockets[0].revents = 0;
|
|
||||||
num_sockets = 1;
|
num_sockets = 1;
|
||||||
|
|
||||||
if(CURL_SOCKET_BAD == sock) {
|
if(CURL_SOCKET_BAD == sock) {
|
||||||
@ -2064,9 +2058,14 @@ int main(int argc, char *argv[])
|
|||||||
init_httprequest(&req);
|
init_httprequest(&req);
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
fd_set input;
|
||||||
|
fd_set output;
|
||||||
|
struct timeval timeout = {0, 250000L}; /* 250 ms */
|
||||||
|
curl_socket_t maxfd = (curl_socket_t)-1;
|
||||||
|
|
||||||
/* Clear out closed sockets */
|
/* Clear out closed sockets */
|
||||||
for (socket_idx = num_sockets - 1; socket_idx >= 1; --socket_idx) {
|
for (socket_idx = num_sockets - 1; socket_idx >= 1; --socket_idx) {
|
||||||
if (CURL_SOCKET_BAD == all_sockets[socket_idx].fd) {
|
if (CURL_SOCKET_BAD == all_sockets[socket_idx]) {
|
||||||
char* dst = (char *) all_sockets + socket_idx;
|
char* dst = (char *) all_sockets + socket_idx;
|
||||||
char* src = (char *) all_sockets + socket_idx + 1;
|
char* src = (char *) all_sockets + socket_idx + 1;
|
||||||
char* end = (char *) all_sockets + num_sockets;
|
char* end = (char *) all_sockets + num_sockets;
|
||||||
@ -2075,17 +2074,41 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = poll(all_sockets, num_sockets, -1);
|
if(got_exit_signal)
|
||||||
|
goto sws_cleanup;
|
||||||
|
|
||||||
|
/* Set up for select*/
|
||||||
|
FD_ZERO(&input);
|
||||||
|
FD_ZERO(&output);
|
||||||
|
|
||||||
|
for (socket_idx = 0; socket_idx < num_sockets; ++socket_idx) {
|
||||||
|
/* Listen on all sockets */
|
||||||
|
FD_SET(all_sockets[socket_idx], &input);
|
||||||
|
if(all_sockets[socket_idx] > maxfd)
|
||||||
|
maxfd = all_sockets[socket_idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
if(got_exit_signal)
|
||||||
|
goto sws_cleanup;
|
||||||
|
|
||||||
|
rc = select((int)maxfd + 1, &input, &output, NULL, &timeout);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
error = SOCKERRNO;
|
error = SOCKERRNO;
|
||||||
logmsg("poll() failed with error: (%d) %s",
|
logmsg("select() failed with error: (%d) %s",
|
||||||
error, strerror(error));
|
error, strerror(error));
|
||||||
goto sws_cleanup;
|
goto sws_cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(got_exit_signal)
|
||||||
|
goto sws_cleanup;
|
||||||
|
|
||||||
|
if (rc == 0) {
|
||||||
|
/* Timed out - try again*/
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the listening socket is ready to accept */
|
/* Check if the listening socket is ready to accept */
|
||||||
if ((all_sockets[0].revents & POLLIN) == POLLIN) {
|
if (FD_ISSET(all_sockets[0], &input)) {
|
||||||
/* Service all queued connections */
|
/* Service all queued connections */
|
||||||
curl_socket_t msgsock;
|
curl_socket_t msgsock;
|
||||||
do {
|
do {
|
||||||
@ -2095,22 +2118,17 @@ int main(int argc, char *argv[])
|
|||||||
goto sws_cleanup;
|
goto sws_cleanup;
|
||||||
} while (msgsock > 0);
|
} while (msgsock > 0);
|
||||||
}
|
}
|
||||||
else if (all_sockets[0].revents != 0) {
|
|
||||||
logmsg("unexpected poll event on listening socket: %d",
|
|
||||||
all_sockets[0].revents);
|
|
||||||
goto sws_cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Service all connections that are ready */
|
/* Service all connections that are ready */
|
||||||
for (socket_idx = 1; socket_idx < num_sockets; ++socket_idx) {
|
for (socket_idx = 1; socket_idx < num_sockets; ++socket_idx) {
|
||||||
if ((all_sockets[socket_idx].revents & POLLIN) == POLLIN) {
|
if (FD_ISSET(all_sockets[socket_idx], &input)) {
|
||||||
if(got_exit_signal)
|
if(got_exit_signal)
|
||||||
goto sws_cleanup;
|
goto sws_cleanup;
|
||||||
|
|
||||||
/* Service this connection until it has nothing available */
|
/* Service this connection until it has nothing available */
|
||||||
do {
|
do {
|
||||||
rc = service_connection(all_sockets[socket_idx].fd, &req, sock, hostport);
|
rc = service_connection(all_sockets[socket_idx], &req, sock, hostport);
|
||||||
logmsg("service_connection %d returned %d", all_sockets[socket_idx].fd, rc);
|
logmsg("service_connection %d returned %d", all_sockets[socket_idx], rc);
|
||||||
if(got_exit_signal)
|
if(got_exit_signal)
|
||||||
goto sws_cleanup;
|
goto sws_cleanup;
|
||||||
|
|
||||||
@ -2129,9 +2147,9 @@ int main(int argc, char *argv[])
|
|||||||
a single byte of server-reply. */
|
a single byte of server-reply. */
|
||||||
wait_ms(50);
|
wait_ms(50);
|
||||||
|
|
||||||
if(all_sockets[socket_idx].fd != CURL_SOCKET_BAD) {
|
if(all_sockets[socket_idx] != CURL_SOCKET_BAD) {
|
||||||
sclose(all_sockets[socket_idx].fd);
|
sclose(all_sockets[socket_idx]);
|
||||||
all_sockets[socket_idx].fd = CURL_SOCKET_BAD;
|
all_sockets[socket_idx] = CURL_SOCKET_BAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
serverlogslocked -= 1;
|
serverlogslocked -= 1;
|
||||||
@ -2147,11 +2165,6 @@ int main(int argc, char *argv[])
|
|||||||
init_httprequest(&req);
|
init_httprequest(&req);
|
||||||
} while (rc > 0);
|
} while (rc > 0);
|
||||||
}
|
}
|
||||||
else if (all_sockets[socket_idx].revents != 0) {
|
|
||||||
logmsg("unexpected poll event on socket %d: %d",
|
|
||||||
socket_idx, all_sockets[socket_idx].revents);
|
|
||||||
goto sws_cleanup;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(got_exit_signal)
|
if(got_exit_signal)
|
||||||
@ -2161,9 +2174,9 @@ int main(int argc, char *argv[])
|
|||||||
sws_cleanup:
|
sws_cleanup:
|
||||||
|
|
||||||
for (socket_idx = 1; socket_idx < num_sockets; ++socket_idx)
|
for (socket_idx = 1; socket_idx < num_sockets; ++socket_idx)
|
||||||
if((all_sockets[socket_idx].fd != sock) &&
|
if((all_sockets[socket_idx] != sock) &&
|
||||||
(all_sockets[socket_idx].fd != CURL_SOCKET_BAD))
|
(all_sockets[socket_idx] != CURL_SOCKET_BAD))
|
||||||
sclose(all_sockets[socket_idx].fd);
|
sclose(all_sockets[socket_idx]);
|
||||||
|
|
||||||
if(sock != CURL_SOCKET_BAD)
|
if(sock != CURL_SOCKET_BAD)
|
||||||
sclose(sock);
|
sclose(sock);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user