Changeset: 10df5619d573 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/10df5619d573
Modified Files:
gdk/gdk_bbp.c
gdk/gdk_private.h
gdk/gdk_utils.c
Branch: default
Log Message:
Cleanup: we only have a single free list of bats.
Also see changeset 3e35d7b01223.
diffs (truncated from 369 to 300 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -110,18 +110,8 @@ struct BBPfarm_t BBPfarms[MAXFARMS];
static MT_Lock BBPnameLock = MT_LOCK_INITIALIZER(BBPnameLock);
static bat *BBP_hash = NULL; /* BBP logical name hash buckets */
static bat BBP_mask = 0; /* number of buckets = & mask */
-#define BBP_THREADMASK 0 /* originally: 63 */
-#if SIZEOF_SIZE_T == 8
-#define threadmask(y) ((int) (mix_lng(y) & BBP_THREADMASK))
-#else
-#define threadmask(y) ((int) (mix_int(y) & BBP_THREADMASK))
-#endif
-static struct {
- MT_Lock cache;
- bat free;
-} GDKbbpLock[BBP_THREADMASK + 1];
-#define GDKcacheLock(y) GDKbbpLock[y].cache
-#define BBP_free(y) GDKbbpLock[y].free
+static MT_Lock GDKcacheLock = MT_LOCK_INITIALIZER(GDKcacheLock);
+static bat BBP_free;
static gdk_return BBPfree(BAT *b);
static void BBPdestroy(BAT *b);
@@ -283,8 +273,7 @@ BBPlock(void)
}
MT_lock_set(&GDKtmLock);
- for (i = 0; i <= BBP_THREADMASK; i++)
- MT_lock_set(&GDKcacheLock(i));
+ MT_lock_set(&GDKcacheLock);
for (i = 0; i <= BBP_BATMASK; i++)
MT_lock_set(&GDKswapLock(i));
locked_by = MT_getpid();
@@ -299,17 +288,15 @@ BBPunlock(void)
for (i = BBP_BATMASK; i >= 0; i--)
MT_lock_unset(&GDKswapLock(i));
- for (i = BBP_THREADMASK; i >= 0; i--)
- MT_lock_unset(&GDKcacheLock(i));
+ MT_lock_unset(&GDKcacheLock);
locked_by = 0;
MT_lock_unset(&GDKtmLock);
}
static gdk_return
-BBPinithash(int j, bat size)
+BBPinithash(bat size)
{
- assert(j >= 0 && j <= BBP_THREADMASK);
for (BBP_mask = 1; (BBP_mask << 1) <= BBPlimit; BBP_mask <<= 1)
;
BBP_hash = (bat *) GDKzalloc(BBP_mask * sizeof(bat));
@@ -326,10 +313,8 @@ BBPinithash(int j, bat size)
BBP_insert(size);
}
} else {
- BBP_next(size) = BBP_free(j);
- BBP_free(j) = size;
- if (++j > BBP_THREADMASK)
- j = 0;
+ BBP_next(size) = BBP_free;
+ BBP_free = size;
}
}
return GDK_SUCCEED;
@@ -363,7 +348,7 @@ BBPselectfarm(role_t role, int type, enu
}
static gdk_return
-BBPextend(int idx, bool buildhash, bat newsize)
+BBPextend(bool buildhash, bat newsize)
{
if (newsize >= N_BBPINIT * BBPINIT) {
GDKerror("trying to extend BAT pool beyond the "
@@ -388,13 +373,10 @@ BBPextend(int idx, bool buildhash, bat n
}
if (buildhash) {
- int i;
-
GDKfree(BBP_hash);
BBP_hash = NULL;
- for (i = 0; i <= BBP_THREADMASK; i++)
- BBP_free(i) = 0;
- if (BBPinithash(idx, newsize) != GDK_SUCCEED)
+ BBP_free = 0;
+ if (BBPinithash(newsize) != GDK_SUCCEED)
return GDK_FAIL;
}
return GDK_SUCCEED;
@@ -688,7 +670,7 @@ BBPreadEntries(FILE *fp, unsigned bbpver
bid = (bat) batid;
if (batid >= (uint64_t) ATOMIC_GET(&BBPsize)) {
if ((bat) ATOMIC_GET(&BBPsize) + 1 >= BBPlimit &&
- BBPextend(0, false, bid + 1) != GDK_SUCCEED)
+ BBPextend(false, bid + 1) != GDK_SUCCEED)
goto bailout;
ATOMIC_SET(&BBPsize, bid + 1);
}
@@ -1457,7 +1439,7 @@ BBPmanager(void *dummy)
static MT_Id manager;
gdk_return
-BBPinit(bool first)
+BBPinit(void)
{
FILE *fp = NULL;
struct stat st;
@@ -1482,14 +1464,6 @@ BBPinit(bool first)
* array */
static_assert((uint64_t) N_BBPINIT * BBPINIT < (UINT64_C(1) << (3 *
(sizeof(BBP[0][0].bak) - 5))), "\"bak\" array in BBPrec is too small");
- if (first) {
- for (i = 0; i <= BBP_THREADMASK; i++) {
- char name[MT_NAME_LEN];
- snprintf(name, sizeof(name), "GDKcacheLock%d", i);
- MT_lock_init(&GDKbbpLock[i].cache, name);
- GDKbbpLock[i].free = 0;
- }
- }
if (!GDKinmemory(0)) {
str bbpdirstr, backupbbpdirstr;
@@ -1602,7 +1576,7 @@ BBPinit(bool first)
}
/* allocate BBP records */
- if (BBPextend(0, false, bbpsize) != GDK_SUCCEED) {
+ if (BBPextend(false, bbpsize) != GDK_SUCCEED) {
GDKdebug = dbg;
return GDK_FAIL;
}
@@ -1621,7 +1595,7 @@ BBPinit(bool first)
}
MT_lock_set(&BBPnameLock);
- if (BBPinithash(0, (bat) ATOMIC_GET(&BBPsize)) != GDK_SUCCEED) {
+ if (BBPinithash((bat) ATOMIC_GET(&BBPsize)) != GDK_SUCCEED) {
TRC_CRITICAL(GDK, "BBPinithash failed");
MT_lock_unset(&BBPnameLock);
#ifdef GDKLIBRARY_HASHASH
@@ -2429,77 +2403,26 @@ BBPgetsubdir(str s, bat i)
*s = 0;
}
-/* There are BBP_THREADMASK+1 (64) free lists, and ours (idx) is
- * empty. Here we find a longish free list (at least 20 entries), and
- * if we can find one, we take one entry from that list. If no long
- * enough list can be found, we create a new entry by either just
+/* The free list is empty. We create a new entry by either just
* increasing BBPsize (up to BBPlimit) or extending the BBP (which
- * increases BBPlimit). Every time this function is called we start
- * searching in a following free list (variable "last").
+ * increases BBPlimit).
*
* Note that this is the only place in normal, multi-threaded operation
* where BBPsize is assigned a value (never decreasing), that the
* assignment happens after any necessary memory was allocated and
* initialized, and that this happens when the BBPnameLock is held. */
static gdk_return
-maybeextend(int idx)
+maybeextend(void)
{
-#if BBP_THREADMASK > 0
- int t, m;
- int n, l;
- bat i;
- static int last = 0;
-
- l = 0; /* length of longest list */
- m = 0; /* index of longest list */
- /* find a longish free list */
- for (t = 0; t <= BBP_THREADMASK && l <= 20; t++) {
- n = 0;
- for (i = BBP_free((t + last) & BBP_THREADMASK);
- i != 0 && n <= 20;
- i = BBP_next(i))
- n++;
- if (n > l) {
- m = (t + last) & BBP_THREADMASK;
- l = n;
- }
- }
- if (l > 20) {
- /* list is long enough, get an entry from there */
- i = BBP_free(m);
- BBP_free(m) = BBP_next(i);
- BBP_next(i) = 0;
- BBP_free(idx) = i;
+ bat size = (bat) ATOMIC_GET(&BBPsize);
+ if (size >= BBPlimit &&
+ BBPextend(true, size + 1) != GDK_SUCCEED) {
+ /* nothing available */
+ return GDK_FAIL;
} else {
-#endif
- /* let the longest list alone, get a fresh entry */
- bat size = (bat) ATOMIC_GET(&BBPsize);
- if (size >= BBPlimit &&
- BBPextend(idx, true, size + 1) != GDK_SUCCEED) {
- /* couldn't extend; if there is any
- * free entry, take it from the
- * longest list after all */
-#if BBP_THREADMASK > 0
- if (l > 0) {
- i = BBP_free(m);
- BBP_free(m) = BBP_next(i);
- BBP_next(i) = 0;
- BBP_free(idx) = i;
- GDKclrerr();
- } else
-#endif
- {
- /* nothing available */
- return GDK_FAIL;
- }
- } else {
- ATOMIC_SET(&BBPsize, size + 1);
- BBP_free(idx) = size;
- }
-#if BBP_THREADMASK > 0
+ ATOMIC_SET(&BBPsize, size + 1);
+ BBP_free = size;
}
- last = (last + 1) & BBP_THREADMASK;
-#endif
return GDK_SUCCEED;
}
@@ -2511,53 +2434,37 @@ BBPinsert(BAT *bn)
bool lock = locked_by == 0 || locked_by != pid;
char dirname[24];
bat i;
- int idx = threadmask(pid), len = 0;
+ int len = 0;
/* critical section: get a new BBP entry */
if (lock) {
- MT_lock_set(&GDKcacheLock(idx));
+ MT_lock_set(&GDKcacheLock);
}
/* find an empty slot */
- if (BBP_free(idx) <= 0) {
+ if (BBP_free <= 0) {
/* we need to extend the BBP */
gdk_return r = GDK_SUCCEED;
-#if BBP_THREADMASK > 0
- if (lock) {
- /* we must take all locks in a consistent
- * order so first unset the one we've already
- * got */
- MT_lock_unset(&GDKcacheLock(idx));
- for (i = 0; i <= BBP_THREADMASK; i++)
- MT_lock_set(&GDKcacheLock(i));
- }
-#endif
MT_lock_set(&BBPnameLock);
/* check again in case some other thread extended
* while we were waiting */
- if (BBP_free(idx) <= 0) {
- r = maybeextend(idx);
+ if (BBP_free <= 0) {
+ r = maybeextend();
}
MT_lock_unset(&BBPnameLock);
-#if BBP_THREADMASK > 0
- if (lock)
- for (i = BBP_THREADMASK; i >= 0; i--)
- if (i != idx)
- MT_lock_unset(&GDKcacheLock(i));
-#endif
if (r != GDK_SUCCEED) {
if (lock) {
- MT_lock_unset(&GDKcacheLock(idx));
+ MT_lock_unset(&GDKcacheLock);
}
return 0;
}
}
- i = BBP_free(idx);
+ i = BBP_free;
assert(i > 0);
- BBP_free(idx) = BBP_next(i);
+ BBP_free = BBP_next(i);
if (lock) {
- MT_lock_unset(&GDKcacheLock(idx));
+ MT_lock_unset(&GDKcacheLock);
}
/* rest of the work outside the lock */
@@ -2681,13 +2588,13 @@ BBPuncacheit(bat i, bool unloaddesc)
* BBPclear removes a BAT from the BBP directory forever.
*/
static inline void
-bbpclear(bat i, int idx, bool lock)
+bbpclear(bat i, bool lock)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]