Changeset: 1d393c71aa53 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1d393c71aa53
Branch: txtsim
Log Message:
Merge with default.
diffs (240 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/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 -- [email protected]
To unsubscribe send an email to [email protected]