Changeset: e594e03c9562 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/e594e03c9562 Modified Files: gdk/gdk_align.c gdk/gdk_bat.c gdk/gdk_batop.c Branch: Jul2021 Log Message:
Avoid double work and add a few locks. diffs (100 lines): diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c --- a/gdk/gdk_align.c +++ b/gdk/gdk_align.c @@ -178,7 +178,6 @@ BATmaterialize(BAT *b) cnt = BATcapacity(b); if ((tail = GDKmalloc(sizeof(Heap))) == NULL) return GDK_FAIL; - *tail = *b->theap; p = 0; q = BUNlast(b); assert(cnt >= q - p); @@ -253,7 +252,6 @@ BATmaterialize(BAT *b) HEAPdecref(b->theap, false); b->theap = tail; b->tbaseoff = 0; - b->theap->dirty = true; BATsetprop_nolock(b, GDK_NUNIQUE, TYPE_oid, &(oid){is_oid_nil(t) ? 1 : b->batCount}); BATsetprop_nolock(b, GDK_UNIQUE_ESTIMATE, TYPE_dbl, &(dbl){is_oid_nil(t) ? 1.0 : (dbl)b->batCount}); MT_lock_unset(&b->theaplock); diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -1644,9 +1644,11 @@ BUNinplacemulti(BAT *b, const oid *posit b->tnonil = t && ATOMcmp(b->ttype, t, ATOMnilptr(b->ttype)) != 0; } MT_rwlock_wrunlock(&b->thashlock); + MT_lock_set(&b->theaplock); b->theap->dirty = true; if (b->tvheap) b->tvheap->dirty = true; + MT_lock_unset(&b->theaplock); return GDK_SUCCEED; } diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -332,7 +332,6 @@ insert_string_bat(BAT *b, BAT *n, struct BATsetcount(b, oldcnt + ci->ncand); bat_iterator_end(&ni); assert(b->batCapacity >= b->batCount); - b->theap->dirty = true; /* maintain hash */ MT_rwlock_wrlock(&b->thashlock); for (r = oldcnt, cnt = BATcount(b); b->thash && r < cnt; r++) { @@ -405,7 +404,6 @@ append_varsized_bat(BAT *b, BAT *n, stru *dst++ = src[canditer_next(ci) - hseq]; } } - b->theap->dirty = true; BATsetcount(b, BATcount(b) + ci->ncand); /* maintain hash table */ MT_rwlock_wrlock(&b->thashlock); @@ -462,7 +460,6 @@ append_varsized_bat(BAT *b, BAT *n, stru MT_rwlock_wrunlock(&b->thashlock); BATsetcount(b, r); bat_iterator_end(&ni); - b->theap->dirty = true; return GDK_SUCCEED; } @@ -884,7 +881,6 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool } MT_rwlock_wrunlock(&b->thashlock); BATsetcount(b, b->batCount + ci.ncand); - b->theap->dirty = true; } doreturn: @@ -1134,9 +1130,7 @@ BATappend_or_update(BAT *b, BAT *p, cons bool anynil = false; bool locked = false; - b->theap->dirty = true; if (b->tvarsized) { - b->tvheap->dirty = true; for (BUN i = 0; i < ni.count; i++) { oid updid; if (positions) { @@ -1297,6 +1291,9 @@ BATappend_or_update(BAT *b, BAT *p, cons MT_rwlock_wrunlock(&b->thashlock); locked = false; } + MT_lock_set(&b->theaplock); + b->tvheap->dirty = true; + MT_lock_unset(&b->theaplock); } else if (ATOMstorage(b->ttype) == TYPE_msk) { HASHdestroy(b); /* hash doesn't make sense for msk */ for (BUN i = 0; i < ni.count; i++) { @@ -1628,6 +1625,10 @@ BATappend_or_update(BAT *b, BAT *p, cons } } bat_iterator_end(&ni); + MT_lock_set(&b->theaplock); + b->theap->dirty = true; + MT_lock_unset(&b->theaplock); + TRC_DEBUG(ALGO, "BATreplace(" ALGOBATFMT "," ALGOOPTBATFMT "," ALGOBATFMT ") " LLFMT " usec\n", ALGOBATPAR(b), ALGOOPTBATPAR(p), ALGOBATPAR(n), _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list