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