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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to