Changeset: 4753e191f5a7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4753e191f5a7
Modified Files:
        gdk/gdk.h
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_group.c
        gdk/gdk_hash.c
        gdk/gdk_hash.h
        gdk/gdk_imprints.c
        gdk/gdk_join.c
        gdk/gdk_logger.c
        gdk/gdk_logger_old.c
        gdk/gdk_orderidx.c
        gdk/gdk_private.h
        gdk/gdk_select.c
        gdk/gdk_unique.c
        monetdb5/mal/mal_authorize.c
        monetdb5/modules/mal/tokenizer.c
Branch: default
Log Message:

Split batIdxLock into old batIdxLock and r/w thashlock, the latter for hashes.


diffs (truncated from 992 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -771,8 +771,8 @@ typedef struct BAT {
        /* dynamic column properties */
        COLrec T;               /* column info */
        MT_Lock theaplock;      /* lock protecting heap reference changes */
-
-       MT_RWLock batIdxLock;   /* lock to manipulate indexes */
+       MT_RWLock thashlock;    /* lock specifically for hash management */
+       MT_Lock batIdxLock;     /* lock to manipulate other indexes/properties 
*/
 } BAT;
 
 typedef struct BATiter {
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -142,7 +142,8 @@ VIEWcreate(oid seq, BAT *b)
                }
                HEAPdecref(bn->theap, false);
                MT_lock_destroy(&bn->theaplock);
-               MT_rwlock_destroy(&bn->batIdxLock);
+               MT_lock_destroy(&bn->batIdxLock);
+               MT_rwlock_destroy(&bn->thashlock);
                GDKfree(bn);
                return NULL;
        }
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -142,7 +142,9 @@ BATcreatedesc(oid hseq, int tt, bool hea
        snprintf(name, sizeof(name), "heaplock%d", bn->batCacheid); /* fits */
        MT_lock_init(&bn->theaplock, name);
        snprintf(name, sizeof(name), "BATlock%d", bn->batCacheid); /* fits */
-       MT_rwlock_init(&bn->batIdxLock, name);
+       MT_lock_init(&bn->batIdxLock, name);
+       snprintf(name, sizeof(name), "hashlock%d", bn->batCacheid); /* fits */
+       MT_rwlock_init(&bn->thashlock, name);
        bn->batDirtydesc = true;
        return bn;
       bailout:
@@ -247,7 +249,8 @@ COLnew(oid hseq, int tt, BUN cap, role_t
        if (bn->tvheap)
                HEAPdecref(bn->tvheap, true);
        MT_lock_destroy(&bn->theaplock);
-       MT_rwlock_destroy(&bn->batIdxLock);
+       MT_lock_destroy(&bn->batIdxLock);
+       MT_rwlock_destroy(&bn->thashlock);
        GDKfree(bn);
        return NULL;
 }
@@ -635,7 +638,8 @@ BATdestroy(BAT *b)
        GDKfree(b->tvheap);
        PROPdestroy(b);
        MT_lock_destroy(&b->theaplock);
-       MT_rwlock_destroy(&b->batIdxLock);
+       MT_lock_destroy(&b->batIdxLock);
+       MT_rwlock_destroy(&b->thashlock);
        GDKfree(b->theap);
        GDKfree(b);
 }
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2204,7 +2204,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
        mkorderidx = (g == NULL && !reverse && !nilslast && pb != NULL && 
(order || !pb->batTransient));
        if (g == NULL && !reverse && !nilslast &&
            pb != NULL && !BATcheckorderidx(pb)) {
-               MT_rwlock_wrlock(&pb->batIdxLock);
+               MT_lock_set(&pb->batIdxLock);
                if (pb->torderidx == NULL) {
                        /* no index created while waiting for lock */
                        if (mkorderidx) /* keep lock when going to create */
@@ -2214,7 +2214,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
                        mkorderidx = false;
                }
                if (!orderidxlock)
-                       MT_rwlock_wrunlock(&pb->batIdxLock);
+                       MT_lock_unset(&pb->batIdxLock);
        } else {
                mkorderidx = false;
        }
@@ -2441,7 +2441,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
                                GDKfree(m);
                        }
                        if (orderidxlock)
-                               MT_rwlock_wrunlock(&pb->batIdxLock);
+                               MT_lock_unset(&pb->batIdxLock);
                        goto error;
                }
                bn->tsorted = !reverse && !nilslast;
@@ -2464,7 +2464,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
                }
        }
        if (orderidxlock)
-               MT_rwlock_wrunlock(&pb->batIdxLock);
+               MT_lock_unset(&pb->batIdxLock);
        bn->theap->dirty = true;
        bn->tnosorted = 0;
        bn->tnorevsorted = 0;
@@ -2719,11 +2719,22 @@ BATsetprop_nolock(BAT *b, enum prop_t id
 }
 
 PROPrec *
+BATgetprop_try(BAT *b, enum prop_t idx)
+{
+       PROPrec *p = NULL;
+       if (MT_lock_try(&b->batIdxLock)) {
+               p = BATgetprop_nolock(b, idx);
+               MT_lock_unset(&b->batIdxLock);
+       }
+       return p;
+}
+
+PROPrec *
 BATgetprop(BAT *b, enum prop_t idx)
 {
        PROPrec *p;
 
-       MT_rwlock_wrlock(&b->batIdxLock);
+       MT_lock_set(&b->batIdxLock);
        p = BATgetprop_nolock(b, idx);
        if (p == NULL) {
                /* if looking for the min/max value, we may be able to
@@ -2747,7 +2758,7 @@ BATgetprop(BAT *b, enum prop_t idx)
                        break;
                }
        }
-       MT_rwlock_wrunlock(&b->batIdxLock);
+       MT_lock_unset(&b->batIdxLock);
        return p;
 }
 
@@ -2755,18 +2766,18 @@ PROPrec *
 BATsetprop(BAT *b, enum prop_t idx, int type, const void *v)
 {
        PROPrec *p;
-       MT_rwlock_wrlock(&b->batIdxLock);
+       MT_lock_set(&b->batIdxLock);
        p = BATsetprop_nolock(b, idx, type, v);
-       MT_rwlock_wrunlock(&b->batIdxLock);
+       MT_lock_unset(&b->batIdxLock);
        return p;
 }
 
 void
 BATrmprop(BAT *b, enum prop_t idx)
 {
-       MT_rwlock_wrlock(&b->batIdxLock);
+       MT_lock_set(&b->batIdxLock);
        BATrmprop_nolock(b, idx);
-       MT_rwlock_wrunlock(&b->batIdxLock);
+       MT_lock_unset(&b->batIdxLock);
 }
 
 
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -647,7 +647,9 @@ BBPreadEntries(FILE *fp, unsigned bbpver
                snprintf(name, sizeof(name), "heaplock%d", bn->batCacheid); /* 
fits */
                MT_lock_init(&bn->theaplock, name);
                snprintf(name, sizeof(name), "BATlock%d", bn->batCacheid); /* 
fits */
-               MT_rwlock_init(&bn->batIdxLock, name);
+               MT_lock_init(&bn->batIdxLock, name);
+               snprintf(name, sizeof(name), "hashlock%d", bn->batCacheid); /* 
fits */
+               MT_rwlock_init(&bn->thashlock, name);
                ATOMIC_INIT(&bn->theap->refs, 1);
 
                if (base > (uint64_t) GDK_oid_max) {
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -768,14 +768,14 @@ BATgroup_internal(BAT **groups, BAT **ex
        if (gn == NULL)
                goto error;
        ngrps = (oid *) Tloc(gn, 0);
-       MT_rwlock_rdlock(&b->batIdxLock);
+       MT_rwlock_rdlock(&b->thashlock);
        if (b->thash && b->thash != (Hash *) 1)
                maxgrps = b->thash->nunique;
        else if ((prop = BATgetprop_nolock(b, GDK_NUNIQUE)) != NULL)
                maxgrps = prop->v.val.oval;
        else
                maxgrps = cnt / 10;
-       MT_rwlock_rdunlock(&b->batIdxLock);
+       MT_rwlock_rdunlock(&b->thashlock);
        if (!is_oid_nil(maxgrp) && maxgrps < maxgrp)
                maxgrps += maxgrp;
        if (e && maxgrps < BATcount(e))
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -427,7 +427,7 @@ BATcheckhash(BAT *b)
        if (b->thash == (Hash *) 1) {
                /* but when we want to change it, we need the lock */
                TRC_DEBUG_IF(ACCELERATOR) t = GDKusec();
-               MT_rwlock_wrlock(&b->batIdxLock);
+               MT_rwlock_wrlock(&b->thashlock);
                TRC_DEBUG_IF(ACCELERATOR) t = GDKusec() - t;
                /* if still 1 now that we have the lock, we can update */
                if (b->thash == (Hash *) 1) {
@@ -524,7 +524,7 @@ BATcheckhash(BAT *b)
                                                                b->thash = h;
                                                                
TRC_DEBUG(ACCELERATOR,
                                                                          
ALGOBATFMT ": reusing persisted hash\n", ALGOBATPAR(b));
-                                                               
MT_rwlock_wrunlock(&b->batIdxLock);
+                                                               
MT_rwlock_wrunlock(&b->thashlock);
                                                                return true;
                                                        }
                                                        /* if h->nil==h->nbucket
@@ -556,7 +556,7 @@ BATcheckhash(BAT *b)
                        GDKfree(h);
                        GDKclrerr();    /* we're not currently interested in 
errors */
                }
-               MT_rwlock_wrunlock(&b->batIdxLock);
+               MT_rwlock_wrunlock(&b->thashlock);
        }
        ret = b->thash != NULL;
        if (ret)
@@ -643,9 +643,9 @@ BAThashsync(void *arg)
        /* we could check whether b->thash == NULL before getting the
         * lock, and only lock if it isn't; however, it's very
         * unlikely that that is the case, so we don't */
-       MT_rwlock_rdlock(&b->batIdxLock);
+       MT_rwlock_rdlock(&b->thashlock);
        BAThashsave(b, true);
-       MT_rwlock_rdunlock(&b->batIdxLock);
+       MT_rwlock_rdunlock(&b->thashlock);
        BBPunfix(b->batCacheid);
 }
 #endif
@@ -797,10 +797,10 @@ BAThash_impl(BAT *restrict b, struct can
                /* if key, or if small, don't bother dynamically
                 * adjusting the hash mask */
                mask = HASHmask(ci->ncand);
-       } else if (!hascand && (prop = BATgetprop_nolock(b, GDK_NUNIQUE)) != 
NULL) {
+       } else if (!hascand && (prop = BATgetprop_try(b, GDK_NUNIQUE)) != NULL) 
{
                assert(prop->v.vtype == TYPE_oid);
                mask = prop->v.val.oval * 8 / 7;
-       } else if (!hascand && (prop = BATgetprop_nolock(b, GDK_HASH_BUCKETS)) 
!= NULL) {
+       } else if (!hascand && (prop = BATgetprop_try(b, GDK_HASH_BUCKETS)) != 
NULL) {
                assert(prop->v.vtype == TYPE_oid);
                mask = prop->v.val.oval;
                maxmask = HASHmask(ci->ncand);
@@ -990,12 +990,12 @@ BAThash(BAT *b)
        if (BATcheckhash(b)) {
                return GDK_SUCCEED;
        }
-       MT_rwlock_wrlock(&b->batIdxLock);
+       MT_rwlock_wrlock(&b->thashlock);
        if (b->thash == NULL) {
                struct canditer ci;
                canditer_init(&ci, b, NULL);
                if ((b->thash = BAThash_impl(b, &ci, "thash")) == NULL) {
-                       MT_rwlock_wrunlock(&b->batIdxLock);
+                       MT_rwlock_wrunlock(&b->thashlock);
                        return GDK_FAIL;
                }
 #ifdef PERSISTENTHASH
@@ -1004,7 +1004,7 @@ BAThash(BAT *b)
                        BBPfix(b->batCacheid);
                        char name[MT_NAME_LEN];
                        snprintf(name, sizeof(name), "hashsync%d", 
b->batCacheid);
-                       MT_rwlock_wrunlock(&b->batIdxLock);
+                       MT_rwlock_wrunlock(&b->thashlock);
                        if (MT_create_thread(&tid, BAThashsync, b,
                                             MT_THR_DETACHED,
                                             name) < 0) {
@@ -1017,7 +1017,7 @@ BAThash(BAT *b)
                                        "NOT persisting hash %d\n", 
b->batCacheid);
 #endif
        }
-       MT_rwlock_wrunlock(&b->batIdxLock);
+       MT_rwlock_wrunlock(&b->thashlock);
        return GDK_SUCCEED;
 }
 
@@ -1103,9 +1103,9 @@ HASHappend_locked(BAT *b, BUN i, const v
 void
 HASHappend(BAT *b, BUN i, const void *v)
 {
-       MT_rwlock_wrlock(&b->batIdxLock);
+       MT_rwlock_wrlock(&b->thashlock);
        HASHappend_locked(b, i, v);
-       MT_rwlock_wrunlock(&b->batIdxLock);
+       MT_rwlock_wrunlock(&b->thashlock);
 }
 
 /* insert value v at position p into the hash table of b */
@@ -1174,9 +1174,9 @@ HASHinsert_locked(BAT *b, BUN p, const v
 void
 HASHinsert(BAT *b, BUN p, const void *v)
 {
-       MT_rwlock_wrlock(&b->batIdxLock);
+       MT_rwlock_wrlock(&b->thashlock);
        HASHinsert_locked(b, p, v);
-       MT_rwlock_wrunlock(&b->batIdxLock);
+       MT_rwlock_wrunlock(&b->thashlock);
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to