Changeset: 7b411923c441 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7b411923c441
Modified Files:
        gdk/gdk.h
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_calc_convert.c
        gdk/gdk_join.c
        gdk/gdk_logger.c
        gdk/gdk_project.c
        gdk/gdk_select.c
        gdk/gdk_unique.c
        monetdb5/mal/mal_debugger.c
        monetdb5/modules/mal/remote.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_result.c
        sql/storage/bat/bat_storage.c
Branch: default
Log Message:

Fixing data races.
New macro BATtdenseci.


diffs (truncated from 461 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1415,6 +1415,8 @@ gdk_export void GDKqsort(void *restrict 
 /* BAT is dense (i.e., BATtvoid() is true and tseqbase is not NIL) */
 #define BATtdense(b)   (!is_oid_nil((b)->tseqbase) &&                  \
                         ((b)->tvheap == NULL || (b)->tvheap->free == 0))
+#define BATtdensebi(bi)        (!is_oid_nil((bi)->tseq) &&                     
\
+                        ((bi)->vh == NULL || (bi)->vhfree == 0))
 /* BATtvoid: BAT can be (or actually is) represented by TYPE_void */
 #define BATtvoid(b)    (BATtdense(b) || (b)->ttype==TYPE_void)
 #define BATtkey(b)     ((b)->tkey || BATtdense(b))
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -736,7 +736,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                /* 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 &&
+               if (BATtdensebi(&ni) && ci.tpe == cand_dense &&
                    (BATcount(b) == 0 ||
                     (BATtdense(b) &&
                      b->tseqbase + BATcount(b) == n->tseqbase + ci.seq - 
hseq))) {
@@ -776,7 +776,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                if (ci.tpe == cand_dense) {
                        b->tnosorted = ci.seq - hseq <= n->tnosorted && 
n->tnosorted < ci.seq + ci.ncand - hseq ? n->tnosorted + hseq - ci.seq : 0;
                        b->tnorevsorted = ci.seq - hseq <= n->tnorevsorted && 
n->tnorevsorted < ci.seq + ci.ncand - hseq ? n->tnorevsorted + hseq - ci.seq : 
0;
-                       if (BATtdense(n)) {
+                       if (BATtdensebi(&ni)) {
                                b->tseqbase = n->tseqbase + ci.seq - hseq;
                        }
                } else {
@@ -812,7 +812,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                        BATkey(b, false);
                }
                if (b->ttype != TYPE_void && b->tsorted && BATtdense(b) &&
-                   (!BATtdense(n) ||
+                   (!BATtdensebi(&ni) ||
                     ci.tpe != cand_dense ||
                     1 + *(oid *) BUNtloc(bi, last) != BUNtoid(n, ci.seq - 
hseq))) {
                        b->tseqbase = oid_nil;
@@ -1470,7 +1470,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
                         * properties */
                        bi.minpos = ni.minpos;
                        bi.maxpos = ni.maxpos;
-                       if (BATtdense(n)) {
+                       if (BATtdensebi(&ni)) {
                                /* replaced all of b with a dense sequence */
                                MT_lock_set(&b->theaplock);
                                BATtseqbase(b, ni.tseq);
@@ -1755,7 +1755,7 @@ BATslice(BAT *b, BUN l, BUN h)
                BUN p = l;
                BUN q = h;
 
-               bn = COLnew((oid) (b->hseqbase + low), BATtdense(b) ? TYPE_void 
: b->ttype, h - l, TRANSIENT);
+               bn = COLnew((oid) (b->hseqbase + low), BATtdensebi(&bi) ? 
TYPE_void : b->ttype, h - l, TRANSIENT);
                if (bn == NULL)
                        goto doreturn;
 
@@ -1804,7 +1804,7 @@ BATslice(BAT *b, BUN l, BUN h)
        bn->tnosorted = 0;
        bn->tnokey[0] = bn->tnokey[1] = 0;
        bni = bat_iterator_nolock(bn);
-       if (BATtdense(b)) {
+       if (BATtdensebi(&bi)) {
                BATtseqbase(bn, (oid) (bi.tseq + low));
        } else if (bn->ttype == TYPE_oid) {
                if (BATcount(bn) == 0) {
@@ -2919,7 +2919,7 @@ BATcount_no_nil(BAT *b, BAT *s)
        t = ATOMbasetype(bi.type);
        switch (t) {
        case TYPE_void:
-               cnt = ci.ncand * BATtdense(b);
+               cnt = ci.ncand * BATtdensebi(&bi);
                break;
        case TYPE_msk:
                cnt = ci.ncand;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1863,14 +1863,14 @@ heap_entry(FILE *fp, BATiter *bi, BUN si
                       (unsigned short) bi->sorted |
                           ((unsigned short) bi->revsorted << 7) |
                           ((unsigned short) bi->key << 8) |
-                          ((unsigned short) BATtdense(b) << 9) |
+                          ((unsigned short) BATtdensebi(bi) << 9) |
                           ((unsigned short) bi->nonil << 10) |
                           ((unsigned short) bi->nil << 11),
                       b->tnokey[0] >= size || b->tnokey[1] >= size ? 0 : 
b->tnokey[0],
                       b->tnokey[0] >= size || b->tnokey[1] >= size ? 0 : 
b->tnokey[1],
                       b->tnosorted >= size ? 0 : b->tnosorted,
                       b->tnorevsorted >= size ? 0 : b->tnorevsorted,
-                      b->tseqbase,
+                      bi->tseq,
                       free,
                       bi->minpos < size ? (uint64_t) bi->minpos : (uint64_t) 
oid_nil,
                       bi->maxpos < size ? (uint64_t) bi->maxpos : (uint64_t) 
oid_nil);
diff --git a/gdk/gdk_calc_convert.c b/gdk/gdk_calc_convert.c
--- a/gdk/gdk_calc_convert.c
+++ b/gdk/gdk_calc_convert.c
@@ -1534,7 +1534,7 @@ BATconvert(BAT *b, BAT *s, int tp, bool 
                return NULL;
        }
        if (ATOMstorage(tp) == TYPE_msk) {
-               if (BATtdense(b)) {
+               if (BATtdensebi(&bi)) {
                        /* dense to msk is easy: all values 1, except
                         * maybe the first */
                        bn = BATconstant(ci.hseq, tp, &(msk){1}, ci.ncand,
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2757,7 +2757,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                          "existing hash%s\n",
                          ALGOBATPAR(r),
                          swapped ? " (swapped)" : "");
-       } else if (BATtdense(r)) {
+       } else if (BATtdensebi(&ri)) {
                /* no hash, just dense lookup */
                MT_thread_setalgorithm(swapped ? "hashjoin on dense (swapped)" 
: "hashjoin on dense");
        } else {
@@ -2776,7 +2776,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                GDKerror("Hash disappeared for "ALGOBATFMT"\n", ALGOBATPAR(r));
                goto bailout;
        }
-       assert(hsh != NULL || BATtdense(r));
+       assert(hsh != NULL || BATtdensebi(&ri));
        if (hsh) {
                TRC_DEBUG(ALGO, "hash for " ALGOBATFMT ": nbucket " BUNFMT ", 
nunique " BUNFMT ", nheads " BUNFMT "\n", ALGOBATPAR(r), hsh->nbucket, 
hsh->nunique, hsh->nheads);
        }
@@ -2800,7 +2800,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                                                       false, false, __func__, 
t0);
                                }
                        }
-               } else if (!BATtdense(r)) {
+               } else if (!BATtdensebi(&ri)) {
                        for (rb = HASHget(hsh, HASHprobe(hsh, nil));
                             rb != BUN_NONE;
                             rb = HASHgetlink(hsh, rb)) {
@@ -2850,7 +2850,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                        GDK_CHECK_TIMEOUT(timeoffset, counter,
                                        GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                        lo = canditer_next(lci);
-                       if (BATtdense(l))
+                       if (BATtdensebi(&li))
                                lval = lo - l->hseqbase + l->tseqbase;
                        else if (li.type != TYPE_void)
                                v = VALUE(l, lo - l->hseqbase);
@@ -2877,7 +2877,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                                                break;
                                }
                        } else if (hsh == NULL) {
-                               assert(BATtdense(r));
+                               assert(BATtdensebi(&ri));
                                ro = *(const oid *) v;
                                if (ro >= r->tseqbase &&
                                    ro < r->tseqbase + r->batCount) {
@@ -3432,7 +3432,7 @@ thetajoin(BAT **r1p, BAT **r2p, BAT *l, 
        }
 
        if (BATtvoid(l)) {
-               if (!BATtdense(l)) {
+               if (!BATtdensebi(&li)) {
                        /* trivial: nils don't match anything */
                        bat_iterator_end(&li);
                        bat_iterator_end(&ri);
@@ -3442,7 +3442,7 @@ thetajoin(BAT **r1p, BAT **r2p, BAT *l, 
                loff = (lng) l->tseqbase - (lng) l->hseqbase;
        }
        if (BATtvoid(r)) {
-               if (!BATtdense(r)) {
+               if (!BATtdensebi(&ri)) {
                        /* trivial: nils don't match anything */
                        bat_iterator_end(&li);
                        bat_iterator_end(&ri);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -130,29 +130,32 @@ log_find(BAT *b, BAT *d, int val)
 
        assert(b->ttype == TYPE_int);
        assert(d->ttype == TYPE_oid);
+       BATiter bi = bat_iterator(b);
        if (BAThash(b) == GDK_SUCCEED) {
-               BATiter cni = bat_iterator_nolock(b);
-               MT_rwlock_rdlock(&cni.b->thashlock);
-               HASHloop_int(cni, cni.b->thash, p, &val) {
+               MT_rwlock_rdlock(&b->thashlock);
+               HASHloop_int(bi, b->thash, p, &val) {
                        oid pos = p;
                        if (BUNfnd(d, &pos) == BUN_NONE) {
-                               MT_rwlock_rdunlock(&cni.b->thashlock);
+                               MT_rwlock_rdunlock(&b->thashlock);
+                               bat_iterator_end(&bi);
                                return p;
                        }
                }
-               MT_rwlock_rdunlock(&cni.b->thashlock);
+               MT_rwlock_rdunlock(&b->thashlock);
        } else {                /* unlikely: BAThash failed */
-               BUN q;
-               int *t = (int *) Tloc(b, 0);
+               int *t = (int *) bi.base;
 
-               for (p = 0, q = BATcount(b); p < q; p++) {
+               for (p = 0; p < bi.count; p++) {
                        if (t[p] == val) {
                                oid pos = p;
-                               if (BUNfnd(d, &pos) == BUN_NONE)
+                               if (BUNfnd(d, &pos) == BUN_NONE) {
+                                       bat_iterator_end(&bi);
                                        return p;
+                               }
                        }
                }
        }
+       bat_iterator_end(&bi);
        return BUN_NONE;
 }
 
@@ -2775,8 +2778,11 @@ log_sequence(logger *lg, int seq, lng va
                fprintf(stderr, "#log_sequence (%d," LLFMT ")\n", seq, val);
 
        logger_lock(lg);
+       MT_lock_set(&lg->seqs_id->theaplock);
+       BUN inserted = lg->seqs_id->batInserted;
+       MT_lock_unset(&lg->seqs_id->theaplock);
        if ((p = log_find(lg->seqs_id, lg->dseqs, seq)) != BUN_NONE &&
-           p >= lg->seqs_id->batInserted) {
+           p >= inserted) {
                assert(lg->seqs_val->hseqbase == 0);
                if (BUNreplace(lg->seqs_val, p, &val, false) != GDK_SUCCEED) {
                        logger_unlock(lg);
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -34,7 +34,7 @@ project1_##TYPE(BAT *restrict bn, BATite
        bt = (TYPE *) Tloc(bn, 0);                                      \
        r1seq = r1i->b->hseqbase;                                       \
        r1end = r1seq + r1i->count;                                     \
-       if (BATtdense(li->b)) {                                         \
+       if (BATtdensebi(li)) {                                          \
                if (li->tseq < r1seq ||                                 \
                    (li->tseq + li->count) >= r1end) {                  \
                        GDKerror("does not match always\n");            \
@@ -87,8 +87,8 @@ project_##TYPE(BAT *restrict bn, BATiter
        oid r2seq, r2end;                                               \
                                                                        \
        if (r2i == NULL &&                                              \
-           (ci == NULL || (ci->tpe == cand_dense && BATtdense(li->b))) && \
-           li->nonil && r1i->type && !BATtdense(r1i->b))               \
+           (ci == NULL || (ci->tpe == cand_dense && BATtdensebi(li))) && \
+           li->nonil && r1i->type && !BATtdensebi(r1i))                \
                return project1_##TYPE(bn, li, r1i);                    \
        MT_thread_setalgorithm(__func__);                               \
        r1t = (const TYPE *) r1i->base;                                 \
@@ -116,7 +116,7 @@ project_##TYPE(BAT *restrict bn, BATiter
                                v = r2t[o - r2seq];                     \
                        bt[lo] = v;                                     \
                }                                                       \
-       } else if (BATtdense(li->b)) {                                  \
+       } else if (BATtdensebi(li)) {                                   \
                for (lo = 0, hi = li->count; lo < hi; lo++) {           \
                        oid o = li->tseq + lo;                          \
                        if (o < r1seq || o >= r2end) {                  \
@@ -178,7 +178,7 @@ project_oid(BAT *restrict bn, BATiter *r
        const oid *restrict r2t = NULL;
        struct canditer r1ci = {0}, r2ci = {0};
 
-       if ((!lci || (lci->tpe == cand_dense && BATtdense(li->b))) && r1i->type 
&& !BATtdense(r1i->b) && !r2i && li->nonil) {
+       if ((!lci || (lci->tpe == cand_dense && BATtdensebi(li))) && r1i->type 
&& !BATtdensebi(r1i) && !r2i && li->nonil) {
                if (sizeof(oid) == sizeof(lng))
                        return project1_lng(bn, li, r1i);
                else
@@ -187,14 +187,14 @@ project_oid(BAT *restrict bn, BATiter *r
        MT_thread_setalgorithm(__func__);
        if (complex_cand(r1i->b))
                canditer_init(&r1ci, NULL, r1i->b);
-       else if (!BATtdense(r1i->b))
+       else if (!BATtdensebi(r1i))
                r1t = (const oid *) r1i->base;
        r1seq = r1i->b->hseqbase;
        r1end = r1seq + r1i->count;
        if (r2i) {
                if (complex_cand(r2i->b))
                        canditer_init(&r2ci, NULL, r2i->b);
-               else if (!BATtdense(r2i->b))
+               else if (!BATtdensebi(r2i))
                        r2t = (const oid *) r2i->base;
                r2seq = r2i->b->hseqbase;
                r2end = r2seq + r2i->count;
@@ -224,7 +224,7 @@ project_oid(BAT *restrict bn, BATiter *r
                                        bt[lo] = o - r2seq + r2i->tseq;
                        }
                }
-       } else if (BATtdense(li->b)) {
+       } else if (BATtdensebi(li)) {
                for (lo = 0, hi = li->count; lo < hi; lo++) {
                        oid o = li->tseq + lo;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to