Changeset: b7ed42e59882 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/b7ed42e59882 Modified Files: gdk/gdk_logger.c Branch: group-commit Log Message:
Merge heads. diffs (truncated from 641 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; } @@ -2917,8 +2920,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); @@ -3050,28 +3056,34 @@ gdk_return log_tstart(logger *lg, bool flushnow, ulng *log_file_id) { MT_lock_set(&lg->rotation_lock); + logger_lock(lg); if (flushnow || lg->request_rotation) { lg->id++; logger_close_output(lg); /* start new file */ if (logger_open_output(lg) != GDK_SUCCEED) { + logger_unlock(lg); MT_lock_unset(&lg->rotation_lock); return GDK_FAIL; } lg->request_rotation = false; if (flushnow) { - while (lg->saved_id+1 < lg->id) + while (lg->saved_id+1 < lg->id) { + logger_unlock(lg); logger_flush(lg, (1ULL<<63)); + logger_lock(lg); + } lg->flushnow = flushnow; } } (void) ATOMIC_INC(&lg->refcount); *log_file_id = lg->id; lg->end++; - MT_lock_unset(&lg->rotation_lock); if (LOG_DISABLED(lg)) { (void) ATOMIC_DEC(&lg->refcount); + logger_unlock(lg); + MT_lock_unset(&lg->rotation_lock); return GDK_SUCCEED; } @@ -3083,7 +3095,12 @@ log_tstart(logger *lg, bool flushnow, ul fprintf(stderr, "#log_tstart %d\n", lg->tid); if (log_write_format(lg, &l) != GDK_SUCCEED) { (void) ATOMIC_DEC(&lg->refcount); + logger_unlock(lg); + MT_lock_unset(&lg->rotation_lock); return GDK_FAIL; } + + logger_unlock(lg); + MT_lock_unset(&lg->rotation_lock); return GDK_SUCCEED; } 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 && \ _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org