Changeset: ef3cbdf879b0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ef3cbdf879b0
Branch: binresultset
Log Message:

merged with default


diffs (254 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1929,6 +1929,8 @@ typedef struct threadStruct {
                                 * into this array + 1 (0 is
                                 * invalid) */
        ATOMIC_TYPE pid;        /* thread id, 0 = unallocated */
+       bat freebats;           /* linked list of free bats */
+       uint32_t nfreebats;     /* number of free bats in .freebats */
        char name[MT_NAME_LEN];
        void *data[THREADDATA];
        uintptr_t sp;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -117,6 +117,8 @@ static MT_Lock BBPnameLock = MT_LOCK_INI
 static bat BBP_hash[BBP_mask+1];       /* BBP logical name hash buckets */
 static MT_Lock GDKcacheLock = MT_LOCK_INITIALIZER(GDKcacheLock);
 static bat BBP_free;
+#define BBP_FREE_LOWATER       10
+#define BBP_FREE_HIWATER       50
 
 static gdk_return BBPfree(BAT *b);
 static void BBPdestroy(BAT *b);
@@ -2399,13 +2401,17 @@ static gdk_return
 maybeextend(void)
 {
        bat size = (bat) ATOMIC_GET(&BBPsize);
-       if (size >= BBPlimit &&
-           BBPextend(size + 1) != GDK_SUCCEED) {
+       if (size + BBP_FREE_LOWATER > BBPlimit &&
+           BBPextend(size + BBP_FREE_LOWATER) != GDK_SUCCEED) {
                /* nothing available */
                return GDK_FAIL;
        } else {
-               ATOMIC_SET(&BBPsize, size + 1);
-               BBP_free = size;
+               ATOMIC_SET(&BBPsize, size + BBP_FREE_LOWATER);
+               for (int i = 0; i < BBP_FREE_LOWATER; i++) {
+                       BBP_next(size) = BBP_free;
+                       BBP_free = size;
+                       size++;
+               }
        }
        return GDK_SUCCEED;
 }
@@ -2419,36 +2425,54 @@ BBPinsert(BAT *bn)
        char dirname[24];
        bat i;
        int len = 0;
-
-       /* critical section: get a new BBP entry */
-       if (lock) {
-               MT_lock_set(&GDKcacheLock);
-       }
-
-       /* find an empty slot */
-       if (BBP_free <= 0) {
-               /* we need to extend the BBP */
-               gdk_return r = GDK_SUCCEED;
-               /* check again in case some other thread extended
-                * while we were waiting */
+       Thread t = (Thread) MT_thread_getdata();
+
+       if (t->freebats == 0) {
+               /* critical section: get a new BBP entry */
+               if (lock) {
+                       MT_lock_set(&GDKcacheLock);
+               }
+
+               /* get a global bat, perhaps extend */
                if (BBP_free <= 0) {
+                       /* we need to extend the BBP */
+                       gdk_return r;
                        r = maybeextend();
+                       if (r != GDK_SUCCEED) {
+                               if (lock) {
+                                       MT_lock_unset(&GDKcacheLock);
+                               }
+                               /* failed */
+                               return 0;
+                       }
                }
-               if (r != GDK_SUCCEED) {
-                       if (lock) {
-                               MT_lock_unset(&GDKcacheLock);
-                       }
-                       return 0;
+               for (int x = 0; x < BBP_FREE_LOWATER; x++) {
+                       i = BBP_free;
+                       if (i == 0)
+                               break;
+                       assert(i > 0);
+                       BBP_free = BBP_next(i);
+                       BBP_next(i) = t->freebats;
+                       t->freebats = i;
+                       t->nfreebats++;
                }
+
+               if (lock) {
+                       MT_lock_unset(&GDKcacheLock);
+               }
+               /* rest of the work outside the lock */
        }
-       i = BBP_free;
-       assert(i > 0);
-       BBP_free = BBP_next(i);
-
-       if (lock) {
-               MT_lock_unset(&GDKcacheLock);
+       if (t->nfreebats > 0) {
+               assert(t->freebats > 0);
+               i = t->freebats;
+               t->freebats = BBP_next(i);
+               BBP_next(i) = 0;
+               t->nfreebats--;
+       } else {
+               assert(t->nfreebats == 0);
+               assert(t->freebats == 0);
+               return 0;
        }
-       /* rest of the work outside the lock */
 
        /* fill in basic BBP fields for the new bat */
 
@@ -2554,13 +2578,26 @@ BBPuncacheit(bat i, bool unloaddesc)
  * BBPclear removes a BAT from the BBP directory forever.
  */
 static inline void
+BBPhandover(Thread t)
+{
+       /* take one bat from our private free list and hand it over to
+        * the global free list */
+       bat i = t->freebats;
+       t->freebats = BBP_next(i);
+       t->nfreebats--;
+       BBP_next(i) = BBP_free;
+       BBP_free = i;
+}
+
+static inline void
 bbpclear(bat i, bool lock)
 {
+       Thread t = (Thread) MT_thread_getdata();
+
        TRC_DEBUG(BAT_, "clear %d (%s)\n", (int) i, BBP_logical(i));
        BBPuncacheit(i, true);
        TRC_DEBUG(BAT_, "set to unloading %d\n", i);
        if (lock) {
-               MT_lock_set(&GDKcacheLock);
                MT_lock_set(&GDKswapLock(i));
        }
 
@@ -2578,11 +2615,19 @@ bbpclear(bat i, bool lock)
                GDKfree(BBP_logical(i));
        BBP_status_set(i, 0);
        BBP_logical(i) = NULL;
-       BBP_next(i) = BBP_free;
-       BBP_free = i;
+       BBP_next(i) = t->freebats;
+       t->freebats = i;
+       t->nfreebats++;
        BBP_pid(i) = ~(MT_Id)0; /* not zero, not a valid thread id */
-       if (lock)
-               MT_lock_unset(&GDKcacheLock);
+       if (t->nfreebats > BBP_FREE_HIWATER) {
+               if (lock)
+                       MT_lock_set(&GDKcacheLock);
+               while (t->nfreebats > BBP_FREE_LOWATER) {
+                       BBPhandover(t);
+               }
+               if (lock)
+                       MT_lock_unset(&GDKcacheLock);
+       }
 }
 
 void
@@ -2594,6 +2639,18 @@ BBPclear(bat i)
        }
 }
 
+void
+BBPrelinquish(Thread t)
+{
+       if (t->nfreebats == 0)
+               return;
+       MT_lock_set(&GDKcacheLock);
+       while (t->nfreebats > 0) {
+               BBPhandover(t);
+       }
+       MT_lock_unset(&GDKcacheLock);
+}
+
 /*
  * @- BBP rename
  *
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -113,6 +113,8 @@ gdk_return BBPinit(void)
 bat BBPinsert(BAT *bn)
        __attribute__((__warn_unused_result__))
        __attribute__((__visibility__("hidden")));
+void BBPrelinquish(Thread t)
+       __attribute__((__visibility__("hidden")));
 int BBPselectfarm(role_t role, int type, enum heaptype hptype)
        __attribute__((__visibility__("hidden")));
 BUN binsearch(const oid *restrict indir, oid offset, int type, const void 
*restrict vals, const char * restrict vars, int width, BUN lo, BUN hi, const 
void *restrict v, int ordering, int last)
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1614,6 +1614,8 @@ THRnew(const char *name, MT_Id pid)
                        s->data[0] = THRdata[0];
                        s->data[1] = THRdata[1];
                        s->sp = THRsp();
+                       s->freebats = 0;
+                       s->nfreebats = 0;
                        strcpy_len(s->name, name, sizeof(s->name));
                        TRC_DEBUG(PAR, "%x %zu sp = %zu\n",
                                  (unsigned) s->tid,
@@ -1697,6 +1699,7 @@ void
 THRdel(Thread t)
 {
        assert(GDKthreads <= t && t < GDKthreads + THREADS);
+       BBPrelinquish(t);
        MT_thread_setdata(NULL);
        TRC_DEBUG(PAR, "pid = %zu, disconnected, %d left\n",
                  (size_t) ATOMIC_GET(&t->pid),
diff --git a/sql/test/BugTracker-2009/Tests/overflow.SF-2853458.test 
b/sql/test/BugTracker-2009/Tests/overflow.SF-2853458.test
--- a/sql/test/BugTracker-2009/Tests/overflow.SF-2853458.test
+++ b/sql/test/BugTracker-2009/Tests/overflow.SF-2853458.test
@@ -1,8 +1,8 @@
-skipif arch=arm64
+skipif arch=aarch64
 statement error 22003!overflow in conversion of 9.2233720368547758e+18 to lng.
 select cast(power(2,63) as bigint) 
 
-onlyif arch=arm64
+onlyif arch=aarch64
 query I
 select cast(power(2,63) as bigint) 
 ----
diff --git a/testing/sqllogictest.py b/testing/sqllogictest.py
--- a/testing/sqllogictest.py
+++ b/testing/sqllogictest.py
@@ -44,6 +44,8 @@ from typing import Optional
 architecture = platform.machine()
 if architecture == 'AMD64':     # Windows :-(
     architecture = 'x86_64'
+if architecture == 'arm64':     # MacOS :-(
+    architecture = 'aarch64'
 
 skipidx = re.compile(r'create index .* \b(asc|desc)\b', re.I)
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to