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 -- [email protected]
To unsubscribe send an email to [email protected]