Changeset: 6b24eaba3cb5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6b24eaba3cb5
Modified Files:
        clients/Tests/exports.stable.out
        clients/odbc/driver/ODBCConvert.c
        clients/odbc/driver/ODBCDesc.h
        clients/odbc/driver/SQLFetch.c
        gdk/gdk.h
        gdk/gdk_utils.c
        monetdb5/mal/mal_client.c
        monetdb5/modules/mal/mal_mapi.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
Branch: Apr2019
Log Message:

Merge


diffs (truncated from 331 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -336,7 +336,6 @@ Thread THRget(int tid);
 void *THRgetdata(int);
 int THRgettid(void);
 int THRhighwater(void);
-Thread THRnew(const char *name);
 void THRsetdata(int, void *);
 void TMabort(void);
 gdk_return TMcommit(void);
@@ -2642,7 +2641,6 @@ str startRef;
 str startTrace(str path);
 str starttraceRef;
 str stopProfiler(void);
-str stopRef;
 str stopTrace(str path);
 str stoptraceRef;
 void strAfterCall(ValPtr v, ValPtr bak);
diff --git a/clients/odbc/driver/ODBCConvert.c 
b/clients/odbc/driver/ODBCConvert.c
--- a/clients/odbc/driver/ODBCConvert.c
+++ b/clients/odbc/driver/ODBCConvert.c
@@ -1282,14 +1282,16 @@ ODBCFetch(ODBCStmt *stmt,
                case SQL_WVARCHAR:
                case SQL_WLONGVARCHAR:
                case SQL_GUID:
-                       if (irdrec->already_returned >= datalen) {
+                       if (irdrec->already_returned < 0)
+                               irdrec->already_returned = 0;
+                       else if ((size_t) irdrec->already_returned >= datalen) {
                                /* no more data to return */
                                if (type == SQL_C_WCHAR && ptr)
                                        free(ptr);
                                return SQL_NO_DATA;
                        }
                        data += irdrec->already_returned;
-                       datalen -= irdrec->already_returned;
+                       datalen -= (size_t) irdrec->already_returned;
                        if (ptr) {
                                copyString(data, datalen, ptr, buflen, lenp,
                                           SQLLEN, addStmtError, stmt,
@@ -1919,7 +1921,9 @@ ODBCFetch(ODBCStmt *stmt,
                case SQL_LONGVARBINARY:
                        break;
                }
-               if (irdrec->already_returned >= datalen) {
+               if (irdrec->already_returned < 0)
+                       irdrec->already_returned = 0;
+               else if ((size_t) irdrec->already_returned >= datalen) {
                        /* no more data to return */
                        return SQL_NO_DATA;
                }
diff --git a/clients/odbc/driver/ODBCDesc.h b/clients/odbc/driver/ODBCDesc.h
--- a/clients/odbc/driver/ODBCDesc.h
+++ b/clients/odbc/driver/ODBCDesc.h
@@ -48,7 +48,7 @@ typedef struct {
        SQLSMALLINT sql_desc_unnamed;
        SQLSMALLINT sql_desc_unsigned;
        SQLSMALLINT sql_desc_updatable;
-       size_t already_returned;
+       ssize_t already_returned;
 } ODBCDescRec;
 
 typedef struct {
diff --git a/clients/odbc/driver/SQLFetch.c b/clients/odbc/driver/SQLFetch.c
--- a/clients/odbc/driver/SQLFetch.c
+++ b/clients/odbc/driver/SQLFetch.c
@@ -115,7 +115,7 @@ MNDBFetch(ODBCStmt *stmt, SQLUSMALLINT *
                stmt->rowSetSize++;
 
                for (i = 1; i <= ird->sql_desc_count; i++)
-                       ird->descRec[i].already_returned = 0;
+                       ird->descRec[i].already_returned = -1;
 
                for (i = 1; i <= ard->sql_desc_count; i++) {
                        rec = &ard->descRec[i];
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2308,7 +2308,6 @@ typedef struct threadStruct {
 
 gdk_export int THRgettid(void);
 gdk_export Thread THRget(int tid);
-gdk_export Thread THRnew(const char *name);
 gdk_export MT_Id THRcreate(void (*f) (void *), void *arg, enum MT_thr_detach 
d, const char *name);
 gdk_export void THRdel(Thread t);
 gdk_export void THRsetdata(int, void *);
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1305,50 +1305,46 @@ GDK_find_self(void)
        return GDK_find_thread(MT_getpid());
 }
 
-Thread
+static Thread
 THRnew(const char *name)
 {
        int tid = 0;
        Thread s;
-       MT_Id pid = MT_getpid();
 
-       s = GDK_find_thread(pid);
-       if (s == NULL) {
-               MT_lock_set(&GDKthreadLock);
-               for (s = GDKthreads; s < GDKthreads + THREADS; s++) {
-                       if (s->pid == 0) {
-                               break;
-                       }
-               }
-               if (s == GDKthreads + THREADS) {
-                       MT_lock_unset(&GDKthreadLock);
-                       IODEBUG fprintf(stderr, "#THRnew: too many threads\n");
-                       GDKerror("THRnew: too many threads\n");
-                       return NULL;
+       MT_lock_set(&GDKthreadLock);
+       for (s = GDKthreads; s < GDKthreads + THREADS; s++) {
+               if (s->pid == 0) {
+                       break;
                }
-               tid = s->tid;
-               *s = (ThreadRec) {
-                       .pid = pid,
-                       .tid = tid,
-                       .data[0] = THRdata[0],
-                       .data[1] = THRdata[1],
-                       .sp = THRsp(),
-                       .name = GDKstrdup(name),
-               };
+       }
+       if (s == GDKthreads + THREADS) {
+               MT_lock_unset(&GDKthreadLock);
+               IODEBUG fprintf(stderr, "#THRnew: too many threads\n");
+               GDKerror("THRnew: too many threads\n");
+               return NULL;
+       }
+       tid = s->tid;
+       *s = (ThreadRec) {
+               .pid = MT_getpid(),
+               .tid = tid,
+               .data[0] = THRdata[0],
+               .data[1] = THRdata[1],
+               .sp = THRsp(),
+               .name = GDKstrdup(name),
+       };
 
-               if (s->name == NULL) {
-                       s->pid = 0;
-                       MT_lock_unset(&GDKthreadLock);
-                       IODEBUG fprintf(stderr, "#THRnew: malloc failure\n");
-                       GDKerror("THRnew: malloc failure\n");
-                       return NULL;
-               }
-               MT_thread_setdata(s);
-               GDKnrofthreads++;
-               PARDEBUG fprintf(stderr, "#%x %zu sp = %zu\n", (unsigned) 
s->tid, (size_t) pid, (size_t) s->sp);
-               PARDEBUG fprintf(stderr, "#nrofthreads %d\n", GDKnrofthreads);
+       if (s->name == NULL) {
+               s->pid = 0; /* deallocate */
                MT_lock_unset(&GDKthreadLock);
+               IODEBUG fprintf(stderr, "#THRnew: malloc failure\n");
+               GDKerror("THRnew: malloc failure\n");
+               return NULL;
        }
+       MT_thread_setdata(s);
+       GDKnrofthreads++;
+       PARDEBUG fprintf(stderr, "#%x %zu sp = %zu\n", (unsigned) s->tid, 
(size_t) s->pid, (size_t) s->sp);
+       PARDEBUG fprintf(stderr, "#nrofthreads %d\n", GDKnrofthreads);
+       MT_lock_unset(&GDKthreadLock);
        return s;
 }
 
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -289,12 +289,9 @@ int
 MCinitClientThread(Client c)
 {
        Thread t;
-       char cname[11 + 1];
 
-       snprintf(cname, 11, OIDFMT, c->user);
-       cname[11] = '\0';
-       t = THRnew(cname);
-       if (t == 0) {
+       t = MT_thread_getdata();        /* should succeed */
+       if (t == NULL) {
                MPresetProfiler(c->fdout);
                return -1;
        }
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
@@ -316,8 +316,7 @@ SERVERlistenThread(SOCKET *Sock)
                        msgsock = usock;
 #endif
                retval = select((int)msgsock + 1, &fds, NULL, NULL, &tv);
-               if (ATOMIC_GET(&serverexiting) ||
-                       GDKexiting())
+               if (ATOMIC_GET(&serverexiting) || GDKexiting())
                        break;
                if (retval == 0) {
                        /* nothing interesting has happened */
@@ -487,12 +486,19 @@ SERVERlistenThread(SOCKET *Sock)
                                                  "cannot fork new client 
thread");
                        continue;
                }
-       } while (!ATOMIC_GET(&serverexiting) &&
-                        !GDKexiting());
+       } while (!ATOMIC_GET(&serverexiting) && !GDKexiting());
        (void) ATOMIC_DEC(&nlistener);
+       if (sock != INVALID_SOCKET)
+               closesocket(sock);
+       if (usock != INVALID_SOCKET)
+               closesocket(usock);
        return;
 error:
        fprintf(stderr, "!mal_mapi.listen: %s, terminating listener\n", msg);
+       if (sock != INVALID_SOCKET)
+               closesocket(sock);
+       if (usock != INVALID_SOCKET)
+               closesocket(usock);
 }
 
 /**
@@ -651,7 +657,7 @@ SERVERlisten(int *Port, str *Usockfile, 
                        server.sin_zero[i] = 0;
                length = (SOCKLEN) sizeof(server);
 
-               do {
+               for (;;) {
                        server.sin_port = htons((unsigned short) ((port) & 
0xFFFF));
                        if (bind(sock, (SOCKPTR) &server, length) == 
SOCKET_ERROR) {
                                int e = errno;
@@ -685,7 +691,7 @@ SERVERlisten(int *Port, str *Usockfile, 
                        } else {
                                break;
                        }
-               } while (1);
+               }
 
                if (getsockname(sock, (SOCKPTR) &server, &length) == 
SOCKET_ERROR) {
                        int e = errno;
@@ -730,6 +736,8 @@ SERVERlisten(int *Port, str *Usockfile, 
                        GDKfree(psock);
                        GDKfree(usockfile);
                        errno = e;
+                       if (sock != INVALID_SOCKET)
+                               closesocket(sock);
                        throw(IO, "mal_mapi.listen",
                                  OPERATION_FAILED ": creation of UNIX socket 
failed: %s",
 #ifdef _MSC_VER
@@ -747,6 +755,8 @@ SERVERlisten(int *Port, str *Usockfile, 
                 * chars long :/ */
                if (strlen(usockfile) >= sizeof(userver.sun_path)) {
                        char *e;
+                       if (sock != INVALID_SOCKET)
+                               closesocket(sock);
                        closesocket(usock);
                        GDKfree(psock);
                        e = createException(MAL, "mal_mapi.listen",
@@ -763,6 +773,8 @@ SERVERlisten(int *Port, str *Usockfile, 
                length = (SOCKLEN) sizeof(userver);
                if(remove(usockfile) == -1 && errno != ENOENT) {
                        char *e = createException(IO, "mal_mapi.listen", 
OPERATION_FAILED ": remove UNIX socket file");
+                       if (sock != INVALID_SOCKET)
+                               closesocket(sock);
                        closesocket(usock);
                        GDKfree(usockfile);
                        GDKfree(psock);
@@ -771,6 +783,8 @@ SERVERlisten(int *Port, str *Usockfile, 
                if (bind(usock, (SOCKPTR) &userver, length) == SOCKET_ERROR) {
                        char *e;
                        int err = errno;
+                       if (sock != INVALID_SOCKET)
+                               closesocket(sock);
                        closesocket(usock);
                        (void) remove(usockfile);
                        GDKfree(psock);
@@ -791,6 +805,8 @@ SERVERlisten(int *Port, str *Usockfile, 
                if(listen(usock, maxusers) == SOCKET_ERROR) {
                        char *e;
                        int err = errno;
+                       if (sock != INVALID_SOCKET)
+                               closesocket(sock);
                        closesocket(usock);
                        (void) remove(usockfile);
                        GDKfree(psock);
@@ -824,6 +840,12 @@ SERVERlisten(int *Port, str *Usockfile, 
        psock[2] = INVALID_SOCKET;
        if (MT_create_thread(&pid, (void (*)(void *)) SERVERlistenThread, psock,
                                                 MT_THR_JOINABLE, 
"listenThread") != 0) {
+               if (sock != INVALID_SOCKET)
+                       closesocket(sock);
+#ifdef HAVE_SYS_UN_H
+               if (usock != INVALID_SOCKET)
+                       closesocket(usock);
+#endif
                GDKfree(psock);
                if (usockfile)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to