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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list