Changeset: 20f46549c0a6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/20f46549c0a6 Modified Files: gdk/gdk_strimps.c gdk/gdk_strimps.h monetdb5/modules/mal/pcre.c Branch: string_imprints Log Message:
Define and use non gdk private functions for strimp ref counting diffs (83 lines): diff --git a/gdk/gdk_strimps.c b/gdk/gdk_strimps.c --- a/gdk/gdk_strimps.c +++ b/gdk/gdk_strimps.c @@ -795,6 +795,55 @@ STRMPappendBitstring(BAT *b, const str s } void +STRMPbatdecref(BAT *b, bool remove) +{ + Strimps *strimps; + BAT *pb = NULL; + + if (VIEWtparent(b)) { + pb = BBP_cache(VIEWtparent(b)); + assert(pb); + } else { + pb = b; + } + + MT_lock_set(&pb->batIdxLock); + if (pb && pb->tstrimps && pb->tstrimps != (Strimps *)1) { + strimps = pb->tstrimps; + } else { + MT_lock_unset(&pb->batIdxLock); + return; + } + STRMPdecref(strimps, remove); + MT_lock_unset(&pb->batIdxLock); +} + +void +STRMPbatincref(BAT *b) +{ + Strimps *strimps; + BAT *pb = NULL; + + if (VIEWtparent(b)) { + pb = BBP_cache(VIEWtparent(b)); + assert(pb); + } else { + pb = b; + } + + MT_lock_set(&pb->batIdxLock); + if (pb && pb->tstrimps && pb->tstrimps != (Strimps *)1) { + strimps = pb->tstrimps; + } else { + MT_lock_unset(&pb->batIdxLock); + return; + } + STRMPincref(strimps); + MT_lock_unset(&pb->batIdxLock); + +} + +void STRMPdecref(Strimps *strimps, bool remove) { TRC_DEBUG(ACCELERATOR, "Decrement ref count of %s to " ULLFMT "\n", diff --git a/gdk/gdk_strimps.h b/gdk/gdk_strimps.h --- a/gdk/gdk_strimps.h +++ b/gdk/gdk_strimps.h @@ -46,4 +46,6 @@ typedef struct { gdk_export gdk_return STRMPcreate(BAT *b, BAT *s); gdk_export BAT *STRMPfilter(BAT *b, BAT *s, const str q); gdk_export gdk_return STRMPappendBitstring(BAT *b, const str s); +gdk_export void STRMPbatdecref(BAT *, bool); +gdk_export void STRMPbatincref(BAT *); #endif /* _GDK_STRIMPS_H_ */ diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c --- a/monetdb5/modules/mal/pcre.c +++ b/monetdb5/modules/mal/pcre.c @@ -1895,8 +1895,10 @@ PCRElikeselect(bat *ret, const bat *bid, */ if (use_strimps && BATcount(b) >= STRIMP_CREATION_THRESHOLD && !*anti) { if (STRMPcreate(b, NULL) == GDK_SUCCEED) { + STRMPbatincref(b); BAT *tmp_s; tmp_s = STRMPfilter(b, s, *pat); + STRMPbatdecref(b, false); if (tmp_s && s) { BBPunfix(s->batCacheid); s = tmp_s; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list