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