Changeset: 17e2c46e5d22 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=17e2c46e5d22
Added Files:
        sql/jdbc/tests/Tests/Test_CallableStmt.SQL.bat
        sql/jdbc/tests/Tests/Test_CallableStmt.SQL.sh
        sql/jdbc/tests/Tests/Test_CallableStmt.stable.err
        sql/jdbc/tests/Tests/Test_CallableStmt.stable.out
Modified Files:
        clients/Tests/exports.stable.out
        configure.ag
        gdk/gdk_posix.c
        gdk/gdk_system.h
        monetdb5/mal/mal_interpreter.c
        monetdb5/modules/mal/remote.c
        monetdb5/modules/mal/remote.h
        sql/backends/monet5/UDF/pyapi/pyapi.c
        sql/backends/monet5/UDF/pyapi/pyapi.h
        sql/jdbc/tests/Tests/All
Branch: default
Log Message:

Merge with Apr2019 branch.


diffs (truncated from 764 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
@@ -1721,7 +1721,6 @@ str RMTisalive(int *ret, str *conn);
 str RMTprelude(void *ret);
 str RMTput(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str RMTregister(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
-str RMTregisterInternal(Client cntxt, str conn, str mod, str fcn);
 str RMTregisterSupervisor(int *ret, str *sup_uuid, str *query_uuid);
 str RMTresolve(bat *ret, str *pat);
 str RUNadder(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -2564,6 +2564,7 @@ AC_CHECK_FUNCS([\
        lockf \
        madvise \
        mremap \
+       nanosleep \
        nl_langinfo \
        _NSGetExecutablePath \
        pipe2 \
diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -1099,11 +1099,15 @@ win_mkdir(const char *pathname, const in
 void
 MT_sleep_ms(unsigned int ms)
 {
-       struct timeval tv;
-
-       tv.tv_sec = ms / 1000;
-       tv.tv_usec = 1000 * (ms % 1000);
-       (void) select(0, NULL, NULL, NULL, &tv);
+#ifdef HAVE_NANOSLEEP
+       (void) nanosleep(&(struct timespec) {.tv_sec = ms / 1000,
+                               .tv_nsec = ms == 1 ? 1000 : (long) (ms % 1000) 
* 1000000,},
+               NULL);
+#else
+       (void) select(0, NULL, NULL, NULL,
+                     &(struct timeval) {.tv_sec = ms / 1000,
+                                     .tv_usec = ms == 1 ? 1 : (ms % 1000) * 
1000,});
+#endif
 }
 
 #else /* WIN32 */
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -199,12 +199,7 @@ gdk_export int MT_join_thread(MT_Id t);
                (void) ATOMIC_INC(&(l)->contention);                    \
        } while (0)
 
-#define _DBG_LOCK_SLEEP(l)                                             \
-       do {                                                            \
-               if (_spincnt == 1024)                                   \
-                       (void) ATOMIC_INC(&GDKlocksleepcnt);            \
-               (void) ATOMIC_INC(&(l)->sleep);                         \
-       } while (0)
+#define _DBG_LOCK_SLEEP(l)     ((void) ATOMIC_INC(&(l)->sleep))
 
 #define _DBG_LOCK_COUNT_2(l)                                           \
        do {                                                            \
@@ -328,9 +323,10 @@ MT_lock_try(MT_Lock *l)
                if (!MT_lock_try(l)) {                                  \
                        _DBG_LOCK_CONTENTION(l);                        \
                        MT_thread_setlockwait(l);                       \
+                       do                                              \
+                               _DBG_LOCK_SLEEP(l);                     \
                        while (WaitForSingleObject(                     \
-                                      (l)->lock, INFINITE) != WAIT_OBJECT_0) \
-                               ;                                       \
+                                      (l)->lock, INFINITE) != WAIT_OBJECT_0); \
                        MT_thread_setlockwait(NULL);                    \
                }                                                       \
                _DBG_LOCK_LOCKER(l);                                    \
@@ -389,8 +385,9 @@ typedef struct MT_Lock {
                if (!MT_lock_try(l)) {                                  \
                        _DBG_LOCK_CONTENTION(l);                        \
                        MT_thread_setlockwait(l);                       \
-                       while (pthread_mutex_lock(&(l)->lock) != 0)     \
-                               ;                                       \
+                       do                                              \
+                               _DBG_LOCK_SLEEP(l);                     \
+                       while (pthread_mutex_lock(&(l)->lock) != 0);    \
                        MT_thread_setlockwait(NULL);                    \
                }                                                       \
                _DBG_LOCK_LOCKER(l);                                    \
@@ -441,15 +438,12 @@ typedef struct MT_Lock {
                _DBG_LOCK_COUNT_0(l);                                   \
                if (!MT_lock_try(l)) {                                  \
                        /* we didn't get the lock */                    \
-                       int _spincnt = GDKnr_threads > 1 ? 0 : 1023;    \
                        _DBG_LOCK_CONTENTION(l);                        \
                        MT_thread_setlockwait(l);                       \
                        do {                                            \
-                               if (++_spincnt >= 1024) {               \
-                                       _DBG_LOCK_SLEEP(l);             \
-                                       MT_sleep_ms(1);                 \
-                               }                                       \
-                       } while (ATOMIC_TAS(&(l)->lock) != 0);          \
+                               _DBG_LOCK_SLEEP(l);                     \
+                               MT_sleep_ms(1);                         \
+                       } while (!MT_lock_try(l));                      \
                        MT_thread_setlockwait(NULL);                    \
                }                                                       \
                _DBG_LOCK_LOCKER(l);                                    \
@@ -464,10 +458,12 @@ typedef struct MT_Lock {
                _DBG_LOCK_INIT(l);                              \
        } while (0)
 
-#define MT_lock_unset(l)                               \
-               do {                                    \
-                       _DBG_LOCK_UNLOCKER(l);          \
-                       ATOMIC_CLEAR(&(l)->lock);       \
+#define MT_lock_unset(l)                                       \
+               do {                                            \
+                       /* lock should be locked */             \
+                       assert(ATOMIC_TAS(&(l)->lock) != 0);    \
+                       _DBG_LOCK_UNLOCKER(l);                  \
+                       ATOMIC_CLEAR(&(l)->lock);               \
                } while (0)
 
 #define MT_lock_destroy(l)     _DBG_LOCK_DESTROY(l)
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -644,6 +644,34 @@ str runMALsequence(Client cntxt, MalBlkP
                        } else {
                                ret = (*pci->fcn)(cntxt, mb, stk, pci);
 #ifndef NDEBUG
+                               if (ret == MAL_SUCCEED) {
+                                       /* check that the types of actual 
results match
+                                        * expected results */
+                                       for (i = 0; i < pci->retc; i++) {
+                                               int a = getArg(pci, i);
+                                               int t = getArgType(mb, pci, i);
+
+                                               if (isaBatType(t)) {
+                                                       bat bid = 
stk->stk[a].val.bval;
+                                                       BAT *_b = 
BATdescriptor(bid);
+                                                       t = getBatType(t);
+                                                       
assert(stk->stk[a].vtype == TYPE_bat);
+                                                       assert(is_bat_nil(bid) 
||
+                                                                  t == 
TYPE_any ||
+                                                                  
ATOMtype(_b->ttype) == ATOMtype(t));
+                                                       if(_b) BBPunfix(bid);
+                                               } else {
+                                                       assert(t == 
stk->stk[a].vtype);
+                                               }
+                                       }
+                               }
+#endif
+                       }
+                       break;
+               case CMDcall:
+                       ret = malCommandCall(stk, pci);
+#ifndef NDEBUG
+                       if (ret == MAL_SUCCEED) {
                                /* check that the types of actual results match
                                 * expected results */
                                for (i = 0; i < pci->retc; i++) {
@@ -652,39 +680,15 @@ str runMALsequence(Client cntxt, MalBlkP
 
                                        if (isaBatType(t)) {
                                                bat bid = stk->stk[a].val.bval;
-                                               BAT *_b = BATdescriptor(bid);
                                                t = getBatType(t);
                                                assert(stk->stk[a].vtype == 
TYPE_bat);
                                                assert(is_bat_nil(bid) ||
                                                           t == TYPE_any ||
-                                                          ATOMtype(_b->ttype) 
== ATOMtype(t));
-                                               if(_b) BBPunfix(bid);
+                                                          
ATOMtype(BBP_desc(bid)->ttype) == ATOMtype(t));
                                        } else {
                                                assert(t == stk->stk[a].vtype);
                                        }
                                }
-#endif
-                       }
-                       break;
-               case CMDcall:
-                       ret = malCommandCall(stk, pci);
-#ifndef NDEBUG
-                       /* check that the types of actual results match
-                        * expected results */
-                       for (i = 0; i < pci->retc; i++) {
-                               int a = getArg(pci, i);
-                               int t = getArgType(mb, pci, i);
-
-                               if (isaBatType(t)) {
-                                       bat bid = stk->stk[a].val.bval;
-                                       t = getBatType(t);
-                                       assert(stk->stk[a].vtype == TYPE_bat);
-                                       assert(is_bat_nil(bid) ||
-                                                  t == TYPE_any ||
-                                                  
ATOMtype(BBP_desc(bid)->ttype) == ATOMtype(t));
-                               } else {
-                                       assert(t == stk->stk[a].vtype);
-                               }
                        }
 #endif
                        break;
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -74,7 +74,7 @@
 static connection conns = NULL;
 static unsigned char localtype = 0177;
 
-static inline str RMTquery(MapiHdl *ret, str func, Mapi conn, str query);
+static inline str RMTquery(MapiHdl *ret, const char *func, Mapi conn, const 
char *query);
 static inline str RMTinternalcopyfrom(BAT **ret, char *hdr, stream *in);
 
 /**
@@ -220,6 +220,7 @@ str RMTconnectScen(
        }
        c->mconn = m;
        c->nextid = 0;
+       MT_lock_init(&c->lock, c->name);
        c->next = conns;
        conns = c;
 
@@ -234,8 +235,6 @@ str RMTconnectScen(
                c->type = 0;
        }
 
-       MT_lock_init(&c->lock, "remconlock");
-
 #ifdef _DEBUG_MAPI_
        mapi_trace(c->mconn, true);
 #endif
@@ -368,7 +367,7 @@ str RMTdisconnect(void *ret, str *conn) 
  * NOTE: this function acquires the mal_remoteLock before accessing conns
  */
 static inline str
-RMTfindconn(connection *ret, str conn) {
+RMTfindconn(connection *ret, const char *conn) {
        connection c;
 
        /* just make sure the return isn't garbage */
@@ -431,7 +430,7 @@ RMTgetId(char *buf, MalBlkPtr mb, InstrP
  * NOTE: this function assumes a lock for conn is set
  */
 static inline str
-RMTquery(MapiHdl *ret, str func, Mapi conn, str query) {
+RMTquery(MapiHdl *ret, const char *func, Mapi conn, const char *query) {
        MapiHdl mhdl;
 
        *ret = NULL;
@@ -524,6 +523,7 @@ str RMTget(Client cntxt, MalBlkPtr mb, M
        ValPtr v;
 
        (void)mb;
+       (void) cntxt;
 
        conn = *getArgReference_str(stk, pci, 1);
        if (conn == NULL || strcmp(conn, (str)str_nil) == 0)
@@ -572,8 +572,6 @@ str RMTget(Client cntxt, MalBlkPtr mb, M
                snprintf(qbuf, BUFSIZ, "io.print(%s);", ident);
 #ifdef _DEBUG_REMOTE
                fprintf(stderr, "#remote.get:%s\n", qbuf);
-#else
-               (void) cntxt;
 #endif
                /* this call should be a single transaction over the channel*/
                MT_lock_set(&c->lock);
@@ -587,19 +585,24 @@ str RMTget(Client cntxt, MalBlkPtr mb, M
 #endif
                        MT_lock_unset(&c->lock);
                        var = createException(MAL, "remote.get", "%s", tmp);
-                       GDKfree(tmp);
+                       freeException(tmp);
                        return var;
                }
                t = getBatType(rtype);
                b = COLnew(0, t, 0, TRANSIENT);
-               if (b == NULL)
+               if (b == NULL) {
+                       mapi_close_handle(mhdl);
+                       MT_lock_unset(&c->lock);
                        throw(MAL, "remote.get", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               }
 
                if (ATOMvarsized(t)) {
                        while (mapi_fetch_row(mhdl)) {
                                var = mapi_fetch_field(mhdl, 1);
                                if (BUNappend(b, var == NULL ? str_nil : var, 
false) != GDK_SUCCEED) {
                                        BBPreclaim(b);
+                                       mapi_close_handle(mhdl);
+                                       MT_lock_unset(&c->lock);
                                        throw(MAL, "remote.get", 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
                                }
                        }
@@ -614,6 +617,8 @@ str RMTget(Client cntxt, MalBlkPtr mb, M
                                        BUNappend(b, r, false) != GDK_SUCCEED) {
                                        BBPreclaim(b);
                                        GDKfree(r);
+                                       mapi_close_handle(mhdl);
+                                       MT_lock_unset(&c->lock);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to