Changeset: b03059048a25 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b03059048a25 Modified Files: common/stream/stream.c configure.ag monetdb5/modules/mal/mal_mapi.c sql/test/BugTracker-2019/Tests/All sql/test/BugTracker-2019/Tests/double-free.Bug-6757.sql tools/merovingian/daemon/client.c tools/merovingian/daemon/controlrunner.c tools/merovingian/daemon/discoveryrunner.c tools/merovingian/daemon/merovingian.c tools/merovingian/daemon/multiplex-funnel.c Branch: Nov2019 Log Message:
Merge with Apr2019 branch. diffs (truncated from 719 to 300 lines): diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -73,6 +73,9 @@ # include <netinet/tcp.h> # include <netdb.h> #endif +#ifdef HAVE_POLL_H +#include <poll.h> +#endif #ifdef NATIVE_WIN32 #include <io.h> @@ -2489,9 +2492,21 @@ socket_read(stream *restrict s, void *re #endif for (;;) { if (s->timeout) { + int ret; +#ifdef HAVE_POLL + struct pollfd pfd; + + pfd = (struct pollfd) {.fd = s->stream_data.s, + .events = POLLIN}; + + ret = poll(&pfd, 1, (int) s->timeout); + if (ret == -1 || (pfd.revents & POLLERR)) { + s->errnr = MNSTR_READ_ERROR; + return -1; + } +#else struct timeval tv; fd_set fds; - int ret; errno = 0; #ifdef _MSC_VER @@ -2512,6 +2527,7 @@ socket_read(stream *restrict s, void *re s->errnr = MNSTR_READ_ERROR; return -1; } +#endif if (ret == 0) { if (s->timeout_func == NULL || s->timeout_func()) { s->errnr = MNSTR_TIMEOUT; @@ -2520,7 +2536,11 @@ socket_read(stream *restrict s, void *re continue; } assert(ret == 1); +#ifdef HAVE_POLL + assert(pfd.revents & (POLLIN|POLLHUP)); +#else assert(FD_ISSET(s->stream_data.s, &fds)); +#endif } #ifdef _MSC_VER nr = recv(s->stream_data.s, buf, (int) size, 0); @@ -2617,9 +2637,20 @@ static int socket_isalive(stream *s) { SOCKET fd = s->stream_data.s; - char buffer[32]; +#ifdef HAVE_POLL + struct pollfd pfd; + int ret; + pfd = (struct pollfd){.fd = fd}; + if ((ret = poll(&pfd, 1, 0)) == 0) + return 1; + if (ret < 0 || pfd.revents & (POLLERR | POLLHUP)) + return 0; + assert(0); /* unexpected revents value */ + return 0; +#else fd_set fds; struct timeval t; + char buffer[32]; t.tv_sec = 0; t.tv_usec = 0; @@ -2633,6 +2664,7 @@ socket_isalive(stream *s) #endif &fds, NULL, NULL, &t) <= 0 || recv(fd, buffer, sizeof(buffer), MSG_PEEK | MSG_DONTWAIT) != 0; +#endif } static stream * diff --git a/configure.ag b/configure.ag --- a/configure.ag +++ b/configure.ag @@ -2258,6 +2258,7 @@ AC_CHECK_HEADERS([ \ mach-o/dyld.h \ netdb.h \ netinet/in.h \ + poll.h \ procfs.h \ pwd.h \ strings.h \ @@ -2489,6 +2490,7 @@ AC_CHECK_FUNCS([\ nl_langinfo \ _NSGetExecutablePath \ pipe2 \ + poll \ popen \ posix_fadvise \ posix_fallocate \ diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c --- a/monetdb5/modules/mal/mal_mapi.c +++ b/monetdb5/modules/mal/mal_mapi.c @@ -58,6 +58,9 @@ # include <netdb.h> # include <netinet/in.h> #endif +#ifdef HAVE_POLL_H +#include <poll.h> +#endif #ifdef HAVE_SYS_UIO_H # include <sys/uio.h> #endif @@ -275,8 +278,13 @@ SERVERlistenThread(SOCKET *Sock) { char *msg = 0; int retval; +#ifdef HAVE_POLL + struct pollfd pfd[2]; + nfds_t npfd; +#else struct timeval tv; fd_set fds; +#endif SOCKET sock = INVALID_SOCKET; SOCKET usock = INVALID_SOCKET; SOCKET msgsock = INVALID_SOCKET; @@ -291,6 +299,17 @@ SERVERlistenThread(SOCKET *Sock) (void) ATOMIC_INC(&nlistener); do { +#ifdef HAVE_POLL + npfd = 0; + if (sock != INVALID_SOCKET) + pfd[npfd++] = (struct pollfd) {.fd = sock, .events = POLLIN}; +#ifdef HAVE_SYS_UN_H + if (usock != INVALID_SOCKET) + pfd[npfd++] = (struct pollfd) {.fd = usock, .events = POLLIN}; +#endif + /* Wait up to 0.025 seconds (0.001 if testing) */ + retval = poll(pfd, npfd, GDKdebug & FORCEMITOMASK ? 10 : 25); +#else FD_ZERO(&fds); if (sock != INVALID_SOCKET) FD_SET(sock, &fds); @@ -298,7 +317,7 @@ SERVERlistenThread(SOCKET *Sock) if (usock != INVALID_SOCKET) FD_SET(usock, &fds); #endif - /* Wait up to 0.025 seconds (0.01 if testing) */ + /* Wait up to 0.025 seconds (0.001 if testing) */ tv.tv_sec = 0; tv.tv_usec = GDKdebug & FORCEMITOMASK ? 10000 : 25000; @@ -309,6 +328,7 @@ SERVERlistenThread(SOCKET *Sock) msgsock = usock; #endif retval = select((int)msgsock + 1, &fds, NULL, NULL, &tv); +#endif if (ATOMIC_GET(&serverexiting) || GDKexiting()) break; if (retval == 0) { @@ -328,7 +348,13 @@ SERVERlistenThread(SOCKET *Sock) } continue; } - if (sock != INVALID_SOCKET && FD_ISSET(sock, &fds)) { + if (sock != INVALID_SOCKET && +#ifdef HAVE_POLL + (npfd > 0 && pfd[0].fd == sock && pfd[0].revents & POLLIN) +#else + FD_ISSET(sock, &fds) +#endif + ) { if ((msgsock = accept4(sock, (SOCKPTR)0, (socklen_t *)0, SOCK_CLOEXEC)) == INVALID_SOCKET) { if ( #ifdef _MSC_VER @@ -346,7 +372,14 @@ SERVERlistenThread(SOCKET *Sock) (void) fcntl(msgsock, F_SETFD, FD_CLOEXEC); #endif #ifdef HAVE_SYS_UN_H - } else if (usock != INVALID_SOCKET && FD_ISSET(usock, &fds)) { + } else if (usock != INVALID_SOCKET && +#ifdef HAVE_POLL + ((npfd > 0 && pfd[0].fd == usock && pfd[0].revents & POLLIN) || + (npfd > 1 && pfd[1].fd == usock && pfd[1].revents & POLLIN)) +#else + FD_ISSET(usock, &fds) +#endif + ) { struct msghdr msgh; struct iovec iov; char buf[1]; diff --git a/sql/test/BugTracker-2019/Tests/All b/sql/test/BugTracker-2019/Tests/All --- a/sql/test/BugTracker-2019/Tests/All +++ b/sql/test/BugTracker-2019/Tests/All @@ -34,5 +34,5 @@ HAVE_PYMONETDB?remote-table-non-existent cte-union.Bug-6755 merge-table-limit.Bug-6756 double-free.Bug-6757 -HAVE_LIBPY3?python-loader-string.Bug-6759 +HAVE_LIBPY?python-loader-string.Bug-6759 select-char.Bug-6761 diff --git a/sql/test/BugTracker-2019/Tests/double-free.Bug-6757.sql b/sql/test/BugTracker-2019/Tests/double-free.Bug-6757.sql --- a/sql/test/BugTracker-2019/Tests/double-free.Bug-6757.sql +++ b/sql/test/BugTracker-2019/Tests/double-free.Bug-6757.sql @@ -616,7 +616,7 @@ CREATE TABLE "sys"."_cachedrel_128" ( ); CREATE TABLE "sys"."_cachedrel_130" ( "a1" CHAR(1), - "prob" DECIMAL(38,3) + "prob" DECIMAL(18,3) ); CREATE TABLE "sys"."_cachedrel_134" ( "a1" INTEGER, @@ -772,7 +772,7 @@ CREATE TABLE "sys"."_cachedrel_170" ( ); CREATE TABLE "sys"."_cachedrel_172" ( "a1" CHAR(1), - "prob" DECIMAL(38,3) + "prob" DECIMAL(18,3) ); CREATE TABLE "sys"."_cachedrel_173" ( "a1" INTEGER, @@ -801,7 +801,7 @@ CREATE TABLE "sys"."_cachedrel_178" ( ); CREATE TABLE "sys"."_cachedrel_180" ( "a1" CHAR(1), - "prob" DECIMAL(38,3) + "prob" DECIMAL(18,3) ); CREATE TABLE "sys"."_cachedrel_181" ( "a1" INTEGER, diff --git a/tools/merovingian/daemon/client.c b/tools/merovingian/daemon/client.c --- a/tools/merovingian/daemon/client.c +++ b/tools/merovingian/daemon/client.c @@ -14,6 +14,9 @@ #include <sys/un.h> #include <netdb.h> #include <netinet/in.h> +#ifdef HAVE_POLL_H +#include <poll.h> +#endif #ifdef HAVE_SYS_UIO_H # include <sys/uio.h> #endif @@ -45,7 +48,7 @@ struct threads { }; struct clientdata { int sock; - int isusock; + bool isusock; struct threads *self; }; @@ -71,7 +74,7 @@ handleClient(void *data) sabdb redirs[24]; /* do we need more? */ int r = 0; int sock; - char isusock; + bool isusock; struct threads *self; sock = ((struct clientdata *) data)->sock; @@ -407,16 +410,29 @@ acceptConnections(int sock, int usock) { char *msg; int retval; +#ifdef HAVE_POLL + struct pollfd pfd[2]; +#else fd_set fds; + struct timeval tv; +#endif int msgsock; void *e; - struct timeval tv; struct clientdata *data; struct threads *threads = NULL, **threadp, *p; int errnr; /* saved errno */ do { /* handle socket connections */ + bool isusock = false; + +#ifdef HAVE_POLL + pfd[0] = (struct pollfd) {.fd = sock, .events = POLLIN}; + pfd[1] = (struct pollfd) {.fd = usock, .events = POLLIN}; + + /* Wait up to 5 seconds */ + retval = poll(pfd, 2, 5000); +#else FD_ZERO(&fds); FD_SET(sock, &fds); FD_SET(usock, &fds); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list