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

Reply via email to