Changeset: 90c996d761e9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/90c996d761e9
Modified Files:
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_delta.c
Branch: Jul2021
Log Message:

Remove locks from BATsetcount, add outside where appropriate.


diffs (truncated from 336 to 300 lines):

diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -256,8 +256,8 @@ BATmaterialize(BAT *b)
        b->ttype = TYPE_oid;
        BATsetdims(b);
        b->batDirtydesc = true;
+       BATsetcount(b, b->batCount);
        MT_lock_unset(&b->theaplock);
-       BATsetcount(b, b->batCount);
 
        return GDK_SUCCEED;
 }
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1030,9 +1030,11 @@ BUNappendmulti(BAT *b, const void *value
                        }
                }
                if (dense) {
+                       MT_lock_set(&b->theaplock);
                        if (b->batCount == 0)
                                b->tseqbase = ovals ? ovals[0] : oid_nil;
                        BATsetcount(b, BATcount(b) + count);
+                       MT_lock_unset(&b->theaplock);
                        return GDK_SUCCEED;
                } else {
                        /* we need to materialize b; allocate enough capacity */
@@ -1059,8 +1061,9 @@ BUNappendmulti(BAT *b, const void *value
                        return rc;
        }
 
+       MT_lock_set(&b->theaplock);
        if (count > BATcount(b) / GDK_UNIQUE_ESTIMATE_KEEP_FRACTION)
-               BATrmprop(b, GDK_UNIQUE_ESTIMATE);
+               BATrmprop_nolock(b, GDK_UNIQUE_ESTIMATE);
        b->theap->dirty = true;
        const void *t = b->ttype == TYPE_msk ? &(msk){false} : 
ATOMnilptr(b->ttype);
        if (b->ttype == TYPE_oid) {
@@ -1157,6 +1160,7 @@ BUNappendmulti(BAT *b, const void *value
                b->tnonil = false;
                b->tsorted = b->trevsorted = b->tkey = false;
        }
+       MT_lock_unset(&b->theaplock);
        if (values && b->ttype) {
                int (*atomcmp) (const void *, const void *) = 
ATOMcompare(b->ttype);
                const void *atomnil = ATOMnilptr(b->ttype);
@@ -1165,9 +1169,9 @@ BUNappendmulti(BAT *b, const void *value
                BUN minpos = prop ? (BUN) prop->val.oval : BUN_NONE;
                prop = BATgetprop_nolock(b, GDK_MAX_POS);
                BUN maxpos = prop ? (BUN) prop->val.oval : BUN_NONE;
+               BATiter bi = bat_iterator_nolock(b);
                MT_lock_unset(&b->theaplock);
                const void *minvalp = NULL, *maxvalp = NULL;
-               BATiter bi = bat_iterator_nolock(b);
                if (minpos != BUN_NONE)
                        minvalp = BUNtail(bi, minpos);
                if (maxpos != BUN_NONE)
@@ -1294,7 +1298,9 @@ BUNappendmulti(BAT *b, const void *value
                }
                MT_rwlock_wrunlock(&b->thashlock);
        }
+       MT_lock_set(&b->theaplock);
        BATsetcount(b, p);
+       MT_lock_unset(&b->theaplock);
 
        IMPSdestroy(b); /* no support for inserts in imprints yet */
        OIDXdestroy(b);
@@ -1889,7 +1895,6 @@ BATsetcount(BAT *b, BUN cnt)
        assert(!is_oid_nil(b->hseqbase));
        assert(cnt <= BUN_MAX);
 
-       MT_lock_set(&b->theaplock);
        b->batCount = cnt;
        b->batDirtydesc = true;
        b->theap->dirty |= b->ttype != TYPE_void && b->theap->parentid == 
b->batCacheid && cnt > 0;
@@ -1925,7 +1930,6 @@ BATsetcount(BAT *b, BUN cnt)
                }
        }
        assert(b->batCapacity >= cnt);
-       MT_lock_unset(&b->theaplock);
 }
 
 /*
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -331,9 +331,11 @@ insert_string_bat(BAT *b, BAT *n, struct
                        r++;
                }
        }
+       MT_lock_set(&b->theaplock);
        BATsetcount(b, oldcnt + ci->ncand);
+       assert(b->batCapacity >= b->batCount);
+       MT_lock_unset(&b->theaplock);
        bat_iterator_end(&ni);
-       assert(b->batCapacity >= b->batCount);
        /* maintain hash */
        MT_rwlock_wrlock(&b->thashlock);
        for (r = oldcnt, cnt = BATcount(b); b->thash && r < cnt; r++) {
@@ -406,7 +408,9 @@ append_varsized_bat(BAT *b, BAT *n, stru
                                *dst++ = src[canditer_next(ci) - hseq];
                        }
                }
+               MT_lock_set(&b->theaplock);
                BATsetcount(b, BATcount(b) + ci->ncand);
+               MT_lock_unset(&b->theaplock);
                /* maintain hash table */
                MT_rwlock_wrlock(&b->thashlock);
                for (BUN i = BATcount(b) - ci->ncand;
@@ -467,7 +471,9 @@ append_varsized_bat(BAT *b, BAT *n, stru
                }
        }
        MT_rwlock_wrunlock(&b->thashlock);
+       MT_lock_set(&b->theaplock);
        BATsetcount(b, r);
+       MT_lock_unset(&b->theaplock);
        bat_iterator_end(&ni);
        return GDK_SUCCEED;
 }
@@ -652,7 +658,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
        struct canditer ci;
        BUN cnt;
        BUN r;
-       const ValRecord *prop = NULL, *nprop;
+       const ValRecord *prop = NULL;
        oid hseq = n->hseqbase;
        char buf[64];
        lng t0 = 0;
@@ -699,56 +705,71 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                return GDK_FAIL;
        }
 
-       b->batDirtydesc = true;
-
        IMPSdestroy(b);         /* imprints do not support updates yet */
        OIDXdestroy(b);
-       if (BATcount(b) == 0 || (prop = BATgetprop(b, GDK_MAX_VALUE)) != NULL) {
-               if ((nprop = BATgetprop(n, GDK_MAX_VALUE)) != NULL) {
-                       if (BATcount(b) == 0 || ATOMcmp(b->ttype, VALptr(prop), 
VALptr(nprop)) < 0) {
+
+       MT_lock_set(&n->theaplock);
+       const ValRecord *npropmaxpos, *npropmaxval, *npropminpos, *npropminval;
+       npropmaxval = BATgetprop_nolock(n, GDK_MAX_VALUE);
+       npropmaxpos = BATgetprop_nolock(n, GDK_MAX_POS);
+       npropminval = BATgetprop_nolock(n, GDK_MIN_VALUE);
+       npropminpos = BATgetprop_nolock(n, GDK_MIN_POS);
+       MT_lock_unset(&n->theaplock);
+
+       MT_lock_set(&b->theaplock);
+
+       b->batDirtydesc = true;
+
+       if (BATcount(b) == 0 || (prop = BATgetprop_nolock(b, GDK_MAX_VALUE)) != 
NULL) {
+               if (npropmaxval != NULL) {
+                       if (BATcount(b) == 0 || ATOMcmp(b->ttype, VALptr(prop), 
VALptr(npropmaxval)) < 0) {
                                if (s == NULL) {
-                                       BATsetprop(b, GDK_MAX_VALUE, b->ttype, 
VALptr(nprop));
-                                       if ((nprop = BATgetprop(n, 
GDK_MAX_POS)) != NULL)
-                                               BATsetprop(b, GDK_MAX_POS, 
TYPE_oid, &(oid){nprop->val.oval + BATcount(b)});
+                                       BATsetprop_nolock(b, GDK_MAX_VALUE, 
b->ttype, VALptr(npropmaxval));
+                                       if (npropmaxpos != NULL)
+                                               BATsetprop_nolock(b, 
GDK_MAX_POS, TYPE_oid, &(oid){npropmaxpos->val.oval + BATcount(b)});
                                        else
-                                               BATrmprop(b, GDK_MAX_POS);
+                                               BATrmprop_nolock(b, 
GDK_MAX_POS);
                                } else {
-                                       BATrmprop(b, GDK_MAX_VALUE);
-                                       BATrmprop(b, GDK_MAX_POS);
+                                       BATrmprop_nolock(b, GDK_MAX_VALUE);
+                                       BATrmprop_nolock(b, GDK_MAX_POS);
                                }
                        }
                } else {
-                       BATrmprop(b, GDK_MAX_VALUE);
-                       BATrmprop(b, GDK_MAX_POS);
+                       BATrmprop_nolock(b, GDK_MAX_VALUE);
+                       BATrmprop_nolock(b, GDK_MAX_POS);
                }
        }
-       if (BATcount(b) == 0 || (prop = BATgetprop(b, GDK_MIN_VALUE)) != NULL) {
-               if ((nprop = BATgetprop(n, GDK_MIN_VALUE)) != NULL) {
-                       if (BATcount(b) == 0 || ATOMcmp(b->ttype, VALptr(prop), 
VALptr(nprop)) > 0) {
+       if (BATcount(b) == 0 || (prop = BATgetprop_nolock(b, GDK_MIN_VALUE)) != 
NULL) {
+               if (npropminval != NULL) {
+                       if (BATcount(b) == 0 || ATOMcmp(b->ttype, VALptr(prop), 
VALptr(npropminval)) > 0) {
                                if (s == NULL) {
-                                       BATsetprop(b, GDK_MIN_VALUE, b->ttype, 
VALptr(nprop));
-                                       if ((nprop = BATgetprop(n, 
GDK_MIN_POS)) != NULL)
-                                               BATsetprop(b, GDK_MIN_POS, 
TYPE_oid, &(oid){nprop->val.oval + BATcount(b)});
+                                       BATsetprop_nolock(b, GDK_MIN_VALUE, 
b->ttype, VALptr(npropminval));
+                                       if (npropminpos != NULL)
+                                               BATsetprop_nolock(b, 
GDK_MIN_POS, TYPE_oid, &(oid){npropminpos->val.oval + BATcount(b)});
                                        else
-                                               BATrmprop(b, GDK_MIN_POS);
+                                               BATrmprop_nolock(b, 
GDK_MIN_POS);
                                } else {
-                                       BATrmprop(b, GDK_MIN_VALUE);
-                                       BATrmprop(b, GDK_MIN_POS);
+                                       BATrmprop_nolock(b, GDK_MIN_VALUE);
+                                       BATrmprop_nolock(b, GDK_MIN_POS);
                                }
                        }
                } else {
-                       BATrmprop(b, GDK_MIN_VALUE);
-                       BATrmprop(b, GDK_MIN_POS);
+                       BATrmprop_nolock(b, GDK_MIN_VALUE);
+                       BATrmprop_nolock(b, GDK_MIN_POS);
                }
        }
        if (cnt > BATcount(b) / GDK_UNIQUE_ESTIMATE_KEEP_FRACTION)
-               BATrmprop(b, GDK_UNIQUE_ESTIMATE);
+               BATrmprop_nolock(b, GDK_UNIQUE_ESTIMATE);
+
+       MT_lock_unset(&b->theaplock);
+
        /* load hash so that we can maintain it */
        (void) BATcheckhash(b);
 
        if (b->ttype == TYPE_void) {
                /* b does not have storage, keep it that way if we can */
                HASHdestroy(b); /* we're not maintaining the hash here */
+               MT_lock_set(&b->theaplock);
                if (BATtdense(n) && ci.tpe == cand_dense &&
                    (BATcount(b) == 0 ||
                     (BATtdense(b) &&
@@ -757,6 +778,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                        if (BATcount(b) == 0)
                                BATtseqbase(b, n->tseqbase + ci.seq - hseq);
                        BATsetcount(b, BATcount(b) + cnt);
+                       MT_lock_unset(&b->theaplock);
                        goto doreturn;
                }
                if ((BATcount(b) == 0 || is_oid_nil(b->tseqbase)) &&
@@ -764,10 +786,12 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                        /* both b and n are void/nil */
                        BATtseqbase(b, oid_nil);
                        BATsetcount(b, BATcount(b) + cnt);
+                       MT_lock_unset(&b->theaplock);
                        goto doreturn;
                }
                /* we need to materialize b; allocate enough capacity */
                b->batCapacity = BATcount(b) + cnt;
+               MT_lock_unset(&b->theaplock);
                if (BATmaterialize(b) != GDK_SUCCEED) {
                        bat_iterator_end(&ni);
                        return GDK_FAIL;
@@ -777,6 +801,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
        r = BUNlast(b);
 
        /* property setting */
+       MT_lock_set(&b->theaplock);
        if (BATcount(b) == 0) {
                b->tsorted = n->tsorted;
                b->trevsorted = n->trevsorted;
@@ -830,6 +855,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                b->tnonil &= n->tnonil;
                b->tnil |= n->tnil && cnt == ni.count;
        }
+       MT_lock_unset(&b->theaplock);
        if (b->ttype == TYPE_str) {
                if (insert_string_bat(b, n, &ci, force, mayshare) != 
GDK_SUCCEED) {
                        bat_iterator_end(&ni);
@@ -888,7 +914,9 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                        }
                }
                MT_rwlock_wrunlock(&b->thashlock);
+               MT_lock_set(&b->theaplock);
                BATsetcount(b, b->batCount + ci.ncand);
+               MT_lock_unset(&b->theaplock);
        }
 
   doreturn:
@@ -1114,27 +1142,32 @@ BATappend_or_update(BAT *b, BAT *p, cons
                return GDK_FAIL;
        }
 
-       BATiter bi = bat_iterator_nolock(b);
-       BATiter ni = bat_iterator(n);
-
        OIDXdestroy(b);
        IMPSdestroy(b);
-       if (ni.count > BATcount(b) / GDK_UNIQUE_ESTIMATE_KEEP_FRACTION)
-               BATrmprop(b, GDK_UNIQUE_ESTIMATE);
        /* load hash so that we can maintain it */
        (void) BATcheckhash(b);
 
+       BATiter ni = bat_iterator(n);
+       MT_lock_set(&b->theaplock);
+       BATiter bi = bat_iterator_nolock(b);
+
+       if (ni.count > BATcount(b) / GDK_UNIQUE_ESTIMATE_KEEP_FRACTION)
+               BATrmprop_nolock(b, GDK_UNIQUE_ESTIMATE);
+
        b->tsorted = b->trevsorted = false;
        b->tnosorted = b->tnorevsorted = 0;
        b->tseqbase = oid_nil;
        b->tkey = false;
        b->tnokey[0] = b->tnokey[1] = 0;
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to