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