Changeset: 2e6f6a069750 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2e6f6a069750
Modified Files:
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        gdk/gdk_storage.c
        gdk/gdk_strimps.c
Branch: string_imprints
Log Message:

Add and call deallocation/destruction code for strimps


diffs (175 lines):

diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -378,6 +378,7 @@ VIEWdestroy(BAT *b)
        IMPSdestroy(b);
        OIDXdestroy(b);
        PROPdestroy(b);
+       STRMPdestroy(b);
        VIEWunlink(b);
 
        MT_lock_set(&b->theaplock);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -583,6 +583,7 @@ BATclear(BAT *b, bool force)
        HASHdestroy(b);
        IMPSdestroy(b);
        OIDXdestroy(b);
+       STRMPdestroy(b);
        PROPdestroy(b);
 
        /* we must dispose of all inserted atoms */
@@ -669,6 +670,7 @@ BATfree(BAT *b)
        HASHfree(b);
        IMPSfree(b);
        OIDXfree(b);
+       STRMPfree(b);
        MT_lock_set(&b->theaplock);
        if (nunique != BUN_NONE) {
                b->tunique_est = (double) nunique;
@@ -1268,6 +1270,7 @@ BUNappendmulti(BAT *b, const void *value
 
        IMPSdestroy(b); /* no support for inserts in imprints yet */
        OIDXdestroy(b);
+       STRMPdestroy(b);        /* TODO: use STRMPappendBitstring */
        return GDK_SUCCEED;
 }
 
@@ -1494,6 +1497,7 @@ BUNinplacemulti(BAT *b, const oid *posit
                }
                OIDXdestroy(b);
                IMPSdestroy(b);
+               STRMPdestroy(b);
 
                if (b->tvarsized && b->ttype) {
                        var_t _d;
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -693,6 +693,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
 
        IMPSdestroy(b);         /* imprints do not support updates yet */
        OIDXdestroy(b);
+       STRMPdestroy(b);        /* TODO: use STRMPappendBitString */
        MT_lock_set(&b->theaplock);
        if (BATcount(b) == 0 || b->tmaxpos != BUN_NONE) {
                if (ni.maxpos != BUN_NONE) {
@@ -906,6 +907,7 @@ BATdel(BAT *b, BAT *d)
        OIDXdestroy(b);
        HASHdestroy(b);
        PROPdestroy(b);
+       STRMPdestroy(b);
        if (BATtdense(d)) {
                oid o = d->tseqbase;
                BUN c = BATcount(d);
@@ -1107,6 +1109,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
 
        OIDXdestroy(b);
        IMPSdestroy(b);
+       STRMPdestroy(b);
        MT_lock_set(&b->theaplock);
        if (ni.count > BATcount(b) / GDK_UNIQUE_ESTIMATE_KEEP_FRACTION) {
                b->tunique_est = 0;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1113,6 +1113,7 @@ fixhashashbat(BAT *b)
        IMPSdestroy(b);
        OIDXdestroy(b);
        PROPdestroy(b);
+       STRMPdestroy(b);
 
        /* make backup of heaps */
        const char *t;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -229,6 +229,12 @@ void IMPSincref(Imprints *imprints)
 void IMPSprint(BAT *b)         /* never called: for debugging only */
        __attribute__((__cold__));
 #endif
+void STRMPdecref(Strimps *strimps, bool remove)
+       __attribute__((__visibility__("hidden")));
+void STRMPdestroy(BAT *b)
+       __attribute__((__visibility__("hidden")));
+void STRMPfree(BAT *b)
+       __attribute__((__visibility__("hidden")));
 void MT_init_posix(void)
        __attribute__((__visibility__("hidden")));
 void *MT_mmap(const char *path, int mode, size_t len)
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -995,6 +995,7 @@ BATdelete(BAT *b)
        IMPSdestroy(b);
        OIDXdestroy(b);
        PROPdestroy(b);
+       STRMPdestroy(b);
        HEAPfree(b->theap, true);
        if (b->tvheap)
                HEAPfree(b->tvheap, true);
diff --git a/gdk/gdk_strimps.c b/gdk/gdk_strimps.c
--- a/gdk/gdk_strimps.c
+++ b/gdk/gdk_strimps.c
@@ -788,6 +788,60 @@ STRMPappendBitstring(BAT *b, const str s
        return GDK_SUCCEED;
 }
 
+void
+STRMPdecref(Strimps *strimps, bool remove)
+{
+       strimps->strimps.remove |= remove;
+       if (ATOMIC_DEC(&strimps->strimps.refs) == 0) {
+               ATOMIC_DESTROY(&strimps->strimps.refs);
+               HEAPfree(&strimps->strimps, strimps->strimps.remove);
+               GDKfree(strimps);
+       }
+}
+
+void
+STRMPdestroy(BAT *b)
+{
+       if (b && b->tstrimps) {
+               MT_lock_set(&b->batIdxLock);
+               if (b->tstrimps == (Strimps *)1) {
+                       b->tstrimps = NULL;
+                       GDKunlink(BBPselectfarm(b->batRole, b->ttype, 
strimpheap),
+                                 BATDIR,
+                                 BBP_physical(b->batCacheid),
+                                 "tstrimps");
+               } else if (b->tstrimps != NULL) {
+                       STRMPdecref(b->tstrimps, b->tstrimps->strimps.parentid 
== b->batCacheid);
+                       b->tstrimps = NULL;
+               }
+               MT_lock_unset(&b->batIdxLock);
+       }
+}
+
+void
+STRMPfree(BAT *b)
+{
+       if (b && b->tstrimps) {
+               Strimps *s;
+               MT_lock_set(&b->batIdxLock);
+               if ((s = b->tstrimps) != NULL && s != (Strimps *)1) {
+                       if (GDKinmemory(s->strimps.farmid)) {
+                               b->tstrimps = NULL;
+                               STRMPdecref(s, s->strimps.parentid == 
b->batCacheid);
+                       }
+                       else {
+                               if (s->strimps.parentid == b->batCacheid)
+                                       b->tstrimps = (Strimps *)1;
+                               else
+                                       b->tstrimps = NULL;
+                               STRMPdecref(s, false);
+                       }
+
+               }
+               MT_lock_unset(&b->batIdxLock);
+       }
+}
+
 /* Parallel creation. does not wok*/
 #if 0
 /* Creates the heap for a string imprint. Returns NULL on failure. This
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to