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

Reply via email to