Changeset: 55fc817ec341 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/55fc817ec341
Modified Files:
        gdk/gdk.h
        gdk/gdk_bbp.c
Branch: multi-cachelock
Log Message:

introduce the general free list


diffs (90 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -947,7 +947,7 @@ typedef struct {
        char physical[24];      /* dir + basename for storage */
 #endif
        bat next;               /* next BBP slot in linked list */
-       int pidx;               /* preferred index of associated thread mask */
+       int pidx;               /* preferred index of associated thread mask */ 
// TODO multi-cachelock 2) See if this can be removed or replaced by pid
        int refs;               /* in-memory references on which the loaded 
status of a BAT relies */
        int lrefs;              /* logical references on which the existence of 
a BAT relies */
        ATOMIC_TYPE status;     /* status mask used for spin locking */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -121,10 +121,13 @@ static bat BBP_mask = 0;          /* number of b
 #else
 #define threadmask(y)  ((int) (mix_int(y) & BBP_THREADMASK))
 #endif
+#define GENERAL_LIST_IDX (BBP_THREADMASK + 1)
+#define FREE_CHUNK_ALLOC_SIZE 10
 static struct {
        MT_Lock cache;
        bat free;
-} GDKbbpLock[BBP_THREADMASK + 1];
+} GDKbbpLock[GENERAL_LIST_IDX + 1]; // last GDKbbpLock, i.e. 
GDKbbpLock[GENERAL_LIST_IDX], is the general free list
+
 #define GDKcacheLock(y)        GDKbbpLock[y].cache
 #define BBP_free(y)    GDKbbpLock[y].free
 
@@ -2450,7 +2453,27 @@ BBPgetsubdir(str s, bat i)
  */
 static gdk_return
 maybeextend(int idx) {
-       /* release the current gdkcachelock first to avoid dealocks when 
extending the common pool */
+       MT_lock_set(&GDKcacheLock(GENERAL_LIST_IDX));
+       if (BBP_free(GENERAL_LIST_IDX) > 0) {
+               /* take a chunk out of the general free list on top of my own 
free list */
+               int i = 1;
+               bat cf = BBP_free(GENERAL_LIST_IDX);
+               BBP_pidx(cf) = idx;
+               while (BBP_next(cf) && i < FREE_CHUNK_ALLOC_SIZE) {
+                       cf = BBP_next(cf);
+                       BBP_pidx(cf) = idx;
+                       i++;
+               }
+               BBP_free(GENERAL_LIST_IDX) = BBP_next(cf);
+               MT_lock_unset(&GDKcacheLock(GENERAL_LIST_IDX));
+               BBP_next(cf) = 0;
+               BBP_free(idx) = cf;
+               return GDK_SUCCEED;
+       }
+       /* there wasn't anything left on the general free list */
+       MT_lock_unset(&GDKcacheLock(GENERAL_LIST_IDX));
+
+       /* release the current gdkcachelock first to avoid deadlocks when 
extending the common pool */
        MT_lock_unset(&GDKcacheLock(idx));
        MT_lock_set(&BBPnameLock);
        MT_lock_set(&GDKcacheLock(idx));
@@ -2463,9 +2486,9 @@ maybeextend(int idx) {
 
        bat size = (bat) ATOMIC_GET(&BBPsize);
        /* if the common pool has no more space, extend it */
-       if (size >= BBPlimit) {
+       if (size + FREE_CHUNK_ALLOC_SIZE > BBPlimit) {
                /* extend the common pool */
-               gdk_return r = BBPextend(true, size + 1);
+               gdk_return r = BBPextend(true, size + FREE_CHUNK_ALLOC_SIZE);
                if (r != GDK_SUCCEED) {
                        MT_lock_unset(&BBPnameLock);
                        return GDK_FAIL;
@@ -2473,10 +2496,14 @@ maybeextend(int idx) {
        }
 
        /* extend the thread list */
-       BBP_free(idx) = size;
-       BBP_pidx(size) = idx;
-
-       ATOMIC_SET(&BBPsize, size + 1);
+       BBP_free(idx)   = size;
+       BBP_pidx(size)  = idx;
+       for (bat i = size + 1; i < (size + FREE_CHUNK_ALLOC_SIZE); i++) {
+               BBP_next(i - 1) = i;
+               BBP_pidx(i)             = idx;
+       }
+
+       ATOMIC_SET(&BBPsize, size + FREE_CHUNK_ALLOC_SIZE);
 
        MT_lock_unset(&BBPnameLock);
        return GDK_SUCCEED;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to