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]