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