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

reciprocate redundant free BBP records to general free list


diffs (46 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -138,7 +138,7 @@ static struct {
 #define BBP_stat_free_max(y)   GDKbbpLock[y].stat_free_max
 #define BBP_stat_free_min(y)   GDKbbpLock[y].stat_free_min
 #define BBP_stat_call_count(y) GDKbbpLock[y].stat_call_count
-#define BBP_stat_call_free(y)  GDKbbpLock[y].stat_call_free
+#define BBP_stat_free_count(y) GDKbbpLock[y].stat_free_count
 
 static gdk_return BBPfree(BAT *b);
 static void BBPdestroy(BAT *b);
@@ -2682,7 +2682,33 @@ bbpclear(bat i, int idx, bool lock)
        BBP_logical(i) = NULL;
        BBP_next(i) = BBP_free(idx);
        BBP_free(idx) = i;
+       int stat_free_count = ++BBP_stat_free_count(idx);
+       if (BBP_stat_free_min(idx) > stat_free_count) {
+               BBP_stat_free_min(idx) = stat_free_count;
+       }
+       else if (BBP_stat_free_max(idx) < stat_free_count) {
+               BBP_stat_free_max(idx) = stat_free_count;
+       }
+       if (++BBP_stat_call_count(idx) == GC_FREE_LIST_CALL_COUNT) {
+               const bat a = (BBP_stat_free_max(idx) - BBP_stat_free_min(idx));
+               bat b = a/2;
+               if (b && 2 * a < BBP_stat_free_min(idx)) {
+                       bat first = BBP_free(idx);
+                       bat last = first;
+                       i = first;
+                       while (b--) {
+                               last = i;
+                               i = BBP_next(i);
+                       }
+                       BBP_free(idx) = i;
+                       MT_lock_set(&GDKcacheLock(GENERAL_LIST_IDX));
+                       BBP_next(last) = BBP_free(GENERAL_LIST_IDX);
+                       BBP_free(GENERAL_LIST_IDX) = first;
+               }
+               BBP_stat_call_count(idx) = 0;
+       }
        BBP_pid(i) = ~(MT_Id)0; /* not zero, not a valid thread id */
+
        if (lock)
                MT_lock_unset(&GDKcacheLock(idx));
        MT_lock_unset(&BBPnameLock);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to