Changeset: 7d4d807a667f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7d4d807a667f
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_heap.c
        gdk/gdk_tm.c
Branch: Jan2022
Log Message:

Merge with Jul2021 branch.


diffs (109 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -698,6 +698,14 @@ BATdestroy(BAT *b)
                ATOMIC_DESTROY(&b->tvheap->refs);
                GDKfree(b->tvheap);
        }
+       PROPdestroy_nolock(b);
+       MT_lock_destroy(&b->theaplock);
+       MT_lock_destroy(&b->batIdxLock);
+       MT_rwlock_destroy(&b->thashlock);
+       if (b->theap) {
+               ATOMIC_DESTROY(&b->theap->refs);
+               GDKfree(b->theap);
+       }
        ValPtr p = BATgetprop_nolock(b, (enum prop_t) 21);
        if (p != NULL) {
                Heap *h = p->val.pval;
@@ -705,14 +713,7 @@ BATdestroy(BAT *b)
                /* the bat has not been committed, so we cannot remove
                 * the old tail file */
                HEAPdecref(h, false);
-       }
-       PROPdestroy_nolock(b);
-       MT_lock_destroy(&b->theaplock);
-       MT_lock_destroy(&b->batIdxLock);
-       MT_rwlock_destroy(&b->thashlock);
-       if (b->theap) {
-               ATOMIC_DESTROY(&b->theap->refs);
-               GDKfree(b->theap);
+               BATrmprop_nolock(b, (enum prop_t) 21);
        }
        GDKfree(b);
 }
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2819,6 +2819,14 @@ PROPdestroy_nolock(BAT *b)
        b->tprops = NULL;
        while (p) {
                n = p->next;
+               if (p->id == (enum prop_t) 21) {
+                       /* keep this special property, it must be
+                        * deleted explicitly using BATrmprop */
+                       p->next = b->tprops;
+                       b->tprops = p;
+                       continue;
+               }
+               assert(p->id != (enum prop_t) 20);
                VALclear(&p->v);
                GDKfree(p);
                p = n;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1878,6 +1878,13 @@ BBPexit(void)
                                                HEAPdecref(b->tvheap, false);
                                                b->tvheap = NULL;
                                        }
+                                       ValPtr p = BATgetprop_nolock(b, (enum 
prop_t) 21);
+                                       if (p != NULL) {
+                                               Heap *h = p->val.pval;
+                                               BATrmprop_nolock(b, (enum 
prop_t) 21);
+                                               ATOMIC_AND(&h->refs, 
~DELAYEDREMOVE);
+                                               HEAPdecref(h, false);
+                                       }
                                        PROPdestroy_nolock(b);
                                        MT_lock_unset(&b->theaplock);
                                        BATfree(b);
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -526,7 +526,11 @@ GDKupgradevarheap(BAT *b, var_t v, BUN c
        b->theap = new;
        if (BBP_status(bid) & (BBPEXISTING|BBPDELETED) && BATgetprop_nolock(b, 
(enum prop_t) 21) == NULL) {
                BATsetprop_nolock(b, (enum prop_t) 21, TYPE_ptr, &old);
-               ATOMIC_OR(&old->refs, DELAYEDREMOVE);
+               if ((ATOMIC_OR(&old->refs, DELAYEDREMOVE) & HEAPREFS) == 1) {
+                       /* we have the only reference, we can free the
+                        * memory */
+                       HEAPfree(old, false);
+               }
        } else {
                ValPtr p = BATgetprop_nolock(b, (enum prop_t) 20);
                HEAPdecref(old, p == NULL || strcmp(((Heap*) 
p->val.pval)->filename, old->filename) != 0);
@@ -615,7 +619,7 @@ HEAPdecref(Heap *h, bool remove)
                GDKfree(h);
                break;
        case 1:
-               if (ATOMIC_GET(&h->refs) & DELAYEDREMOVE) {
+               if (refs & DELAYEDREMOVE) {
                        /* only reference left is b->oldtail */
                        HEAPfree(h, false);
                }
diff --git a/gdk/gdk_tm.c b/gdk/gdk_tm.c
--- a/gdk/gdk_tm.c
+++ b/gdk/gdk_tm.c
@@ -85,9 +85,9 @@ epilogue(int cnt, bat *subcommit, bool l
                        ValPtr p = BATgetprop_nolock(b, (enum prop_t) 20);
                        if (p != NULL) {
                                Heap *tail = p->val.pval;
-                               assert(BATgetprop_nolock(b, (enum prop_t) 21) 
!= NULL);
                                BATrmprop_nolock(b, (enum prop_t) 20);
-                               ValPtr p = BATgetprop_nolock(b, (enum prop_t) 
21);
+                               p = BATgetprop_nolock(b, (enum prop_t) 21);
+                               assert(p != NULL);
                                Heap *h = p->val.pval;
                                if (h != (Heap *) 1)
                                        HEAPdecref(h, true);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to