Changeset: eed399c7d869 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/eed399c7d869 Modified Files: gdk/gdk_logger.c gdk/gdk_orderidx.c gdk/gdk_project.c gdk/gdk_search.c gdk/gdk_select.c Branch: Jul2021 Log Message:
Use more bat iterators to access data. We assume the logger bats are protected by the logger_lock. diffs (truncated from 1654 to 300 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -110,7 +110,7 @@ logger_unlock(logger *lg) static bte find_type(logger *lg, int tpe) { - BATiter cni = bat_iterator(lg->type_nr); + BATiter cni = bat_iterator_nolock(lg->type_nr); bte *res = (bte*)Tloc(lg->type_id, 0); BUN p; @@ -119,19 +119,17 @@ find_type(logger *lg, int tpe) MT_rwlock_rdlock(&cni.b->thashlock); HASHloop_int(cni, cni.b->thash, p, &tpe) { MT_rwlock_rdunlock(&cni.b->thashlock); - bat_iterator_end(&cni); return res[p]; } MT_rwlock_rdunlock(&cni.b->thashlock); } - bat_iterator_end(&cni); return -1; } static int find_type_nr(logger *lg, bte tpe) { - BATiter cni = bat_iterator(lg->type_id); + BATiter cni = bat_iterator_nolock(lg->type_id); int *res = (int*)Tloc(lg->type_nr, 0); BUN p; @@ -140,12 +138,10 @@ find_type_nr(logger *lg, bte tpe) MT_rwlock_rdlock(&cni.b->thashlock); HASHloop_bte(cni, cni.b->thash, p, &tpe) { MT_rwlock_rdunlock(&cni.b->thashlock); - bat_iterator_end(&cni); return res[p]; } MT_rwlock_rdunlock(&cni.b->thashlock); } - bat_iterator_end(&cni); return -1; } @@ -157,18 +153,16 @@ log_find(BAT *b, BAT *d, int val) assert(b->ttype == TYPE_int); assert(d->ttype == TYPE_oid); if (BAThash(b) == GDK_SUCCEED) { - BATiter cni = bat_iterator(b); + BATiter cni = bat_iterator_nolock(b); MT_rwlock_rdlock(&cni.b->thashlock); HASHloop_int(cni, cni.b->thash, p, &val) { oid pos = p; if (BUNfnd(d, &pos) == BUN_NONE) { MT_rwlock_rdunlock(&cni.b->thashlock); - bat_iterator_end(&cni); return p; } } MT_rwlock_rdunlock(&cni.b->thashlock); - bat_iterator_end(&cni); } else { /* unlikely: BAThash failed */ BUN q; int *t = (int *) Tloc(b, 0); @@ -187,7 +181,7 @@ log_find(BAT *b, BAT *d, int val) static log_bid internal_find_bat(logger *lg, log_id id) { - BATiter cni = bat_iterator(lg->catalog_id); + BATiter cni = bat_iterator_nolock(lg->catalog_id); BUN p; if (BAThash(lg->catalog_id) == GDK_SUCCEED) { @@ -196,13 +190,11 @@ internal_find_bat(logger *lg, log_id id) oid pos = p; if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) { MT_rwlock_rdunlock(&cni.b->thashlock); - bat_iterator_end(&cni); return *(log_bid *) Tloc(lg->catalog_bid, p); } } MT_rwlock_rdunlock(&cni.b->thashlock); } - bat_iterator_end(&cni); return 0; } @@ -548,7 +540,7 @@ log_read_updates(logger *lg, trans *tr, static gdk_return la_bat_update_count(logger *lg, log_id id, lng cnt) { - BATiter cni = bat_iterator(lg->catalog_id); + BATiter cni = bat_iterator_nolock(lg->catalog_id); BUN p; if (BAThash(lg->catalog_id) == GDK_SUCCEED) { @@ -558,13 +550,11 @@ la_bat_update_count(logger *lg, log_id i assert(lg->catalog_cnt->hseqbase == 0); if (ocnt < cnt && BUNreplace(lg->catalog_cnt, p, &cnt, false) != GDK_SUCCEED) { MT_rwlock_rdunlock(&cni.b->thashlock); - bat_iterator_end(&cni); return GDK_FAIL; } } MT_rwlock_rdunlock(&cni.b->thashlock); } - bat_iterator_end(&cni); return GDK_SUCCEED; } @@ -2351,13 +2341,13 @@ internal_log_bat(logger *lg, BAT *b, log offset = 0; if (b->ttype == TYPE_msk) { if (offset % 32 == 0) { - if (!mnstr_writeIntArray(lg->output_log, Tloc(b, offset / 32), (size_t) ((nr + 31) / 32))) + if (!mnstr_writeIntArray(lg->output_log, (int *) ((char *) bi.base + offset / 32), (size_t) ((nr + 31) / 32))) ok = GDK_FAIL; } else { for (lng i = 0; i < nr; i += 32) { uint32_t v = 0; for (int j = 0; j < 32 && i + j < nr; j++) - v |= (uint32_t) mskGetVal(b, (BUN) (offset + i + j)) << j; + v |= (uint32_t) Tmskval(&bi, (BUN) (offset + i + j)) << j; if (!mnstr_writeInt(lg->output_log, (int) v)) { ok = GDK_FAIL; break; @@ -2506,7 +2496,7 @@ log_delta(logger *lg, BAT *uid, BAT *uva ok = wh(&id, lg->output_log, 1); } if (uval->ttype == TYPE_msk) { - if (!mnstr_writeIntArray(lg->output_log, Tloc(uval, 0), (BUNlast(uval) + 31) / 32)) + if (!mnstr_writeIntArray(lg->output_log, vi.base, (BUNlast(uval) + 31) / 32)) ok = GDK_FAIL; } else { for (p = 0; p < BUNlast(uid) && ok == GDK_SUCCEED; p++) { diff --git a/gdk/gdk_orderidx.c b/gdk/gdk_orderidx.c --- a/gdk/gdk_orderidx.c +++ b/gdk/gdk_orderidx.c @@ -226,7 +226,7 @@ BATorderidx(BAT *b, bool stable) #define BINARY_MERGE(TYPE) \ do { \ - TYPE *v = (TYPE *) Tloc(b, 0); \ + TYPE *v = (TYPE *) bi.base; \ if (p0 < q0 && p1 < q1) { \ if (v[*p0 - b->hseqbase] <= v[*p1 - b->hseqbase]) { \ *mv++ = *p0++; \ @@ -291,7 +291,7 @@ BATorderidx(BAT *b, bool stable) #define NWAY_MERGE(TYPE) \ do { \ TYPE *minhp, t; \ - TYPE *v = (TYPE *) Tloc(b, 0); \ + TYPE *v = (TYPE *) bi.base; \ if ((minhp = GDKmalloc(sizeof(TYPE)*n_ar)) == NULL) { \ goto bailout; \ } \ @@ -359,9 +359,11 @@ GDKmergeidx(BAT *b, BAT**a, int n_ar) return GDK_FAIL; } TRC_DEBUG(ACCELERATOR, "GDKmergeidx(" ALGOBATFMT ") create index\n", ALGOBATPAR(b)); + BATiter bi = bat_iterator(b); MT_lock_set(&b->batIdxLock); if (b->torderidx) { MT_lock_unset(&b->batIdxLock); + bat_iterator_end(&bi); return GDK_SUCCEED; } if ((m = GDKzalloc(sizeof(Heap))) == NULL || @@ -371,6 +373,7 @@ GDKmergeidx(BAT *b, BAT**a, int n_ar) HEAPalloc(m, BATcount(b) + ORDERIDXOFF, SIZEOF_OID, 0) != GDK_SUCCEED) { GDKfree(m); MT_lock_unset(&b->batIdxLock); + bat_iterator_end(&bi); return GDK_FAIL; } m->free = (BATcount(b) + ORDERIDXOFF) * SIZEOF_OID; @@ -426,6 +429,7 @@ GDKmergeidx(BAT *b, BAT**a, int n_ar) HEAPfree(m, true); GDKfree(m); MT_lock_unset(&b->batIdxLock); + bat_iterator_end(&bi); return GDK_FAIL; } @@ -442,6 +446,7 @@ GDKmergeidx(BAT *b, BAT**a, int n_ar) HEAPfree(m, true); GDKfree(m); MT_lock_unset(&b->batIdxLock); + bat_iterator_end(&bi); return GDK_FAIL; } for (i = 0; i < n_ar; i++) { @@ -491,6 +496,7 @@ GDKmergeidx(BAT *b, BAT**a, int n_ar) b->batDirtydesc = true; MT_lock_unset(&b->batIdxLock); + bat_iterator_end(&bi); 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 @@ -22,7 +22,8 @@ #define project1_loop(TYPE) \ static gdk_return \ -project1_##TYPE(BAT *restrict bn, BAT *restrict l, BAT *restrict r1) \ +project1_##TYPE(BAT *restrict bn, BAT *restrict l, BAT *restrict r1, \ + BATiter *restrict r1i) \ { \ BUN lo, hi; \ const TYPE *restrict r1t; \ @@ -30,7 +31,7 @@ project1_##TYPE(BAT *restrict bn, BAT *r oid r1seq, r1end; \ \ MT_thread_setalgorithm(__func__); \ - r1t = (const TYPE *) Tloc(r1, 0); \ + r1t = (const TYPE *) r1i->base; \ bt = (TYPE *) Tloc(bn, 0); \ r1seq = r1->hseqbase; \ r1end = r1seq + BATcount(r1); \ @@ -45,16 +46,19 @@ project1_##TYPE(BAT *restrict bn, BAT *r for (lo = 0, hi = BATcount(l); lo < hi; lo++) \ bt[lo] = r1t[lo]; \ } else { \ - assert(l->ttype);\ - const oid *restrict ot = (const oid *) Tloc(l, 0); \ + assert(l->ttype); \ + BATiter li = bat_iterator(l); \ + const oid *restrict ot = (const oid *) li.base; \ for (lo = 0, hi = BATcount(l); lo < hi; lo++) { \ oid o = ot[lo]; \ if (o < r1seq || o >= r1end) { \ GDKerror("does not match always\n"); \ + bat_iterator_end(&li); \ return GDK_FAIL; \ } \ bt[lo] = r1t[o - r1seq]; \ } \ + bat_iterator_end(&li); \ } \ BATsetcount(bn, lo); \ return GDK_SUCCEED; \ @@ -76,7 +80,8 @@ project1_loop(uuid) static gdk_return \ project_##TYPE(BAT *restrict bn, BAT *restrict l, \ struct canditer *restrict ci, \ - BAT *restrict r1, BAT *restrict r2) \ + BAT *restrict r1, BAT *restrict r2, \ + BATiter *restrict r1i, BATiter *restrict r2i) \ { \ BUN lo, hi; \ const TYPE *restrict r1t; \ @@ -89,10 +94,10 @@ project_##TYPE(BAT *restrict bn, BAT *re if (r2 == NULL && \ (!ci || (ci->tpe == cand_dense && BATtdense(l))) && \ l->tnonil && r1->ttype && !BATtdense(r1)) \ - return project1_##TYPE(bn, l, r1); \ + return project1_##TYPE(bn, l, r1, r1i); \ MT_thread_setalgorithm(__func__); \ - r1t = (const TYPE *) Tloc(r1, 0); \ - r2t = r2 ? (const TYPE *) Tloc(r2, 0) : NULL; \ + r1t = (const TYPE *) r1i->base; \ + r2t = (const TYPE *) r2i->base; /* may be NULL if r2 == NULL */ \ bt = (TYPE *) Tloc(bn, 0); \ r1seq = r1->hseqbase; \ r1end = r1seq + BATcount(r1); \ @@ -129,7 +134,8 @@ project_##TYPE(BAT *restrict bn, BAT *re bt[lo] = v; \ } \ } else { \ - const oid *restrict ot = (const oid *) Tloc(l, 0); \ + BATiter li = bat_iterator(l); \ + const oid *restrict ot = (const oid *) li.base; \ for (lo = 0, hi = BATcount(l); lo < hi; lo++) { \ oid o = ot[lo]; \ if (is_oid_nil(o)) { \ @@ -137,6 +143,7 @@ project_##TYPE(BAT *restrict bn, BAT *re bn->tnil = true; \ } else if (o < r1seq || o >= r2end) { \ GDKerror("does not match always\n"); \ + bat_iterator_end(&li); \ return GDK_FAIL; \ } else if (o < r1end) { \ v = r1t[o - r1seq]; \ @@ -146,6 +153,7 @@ project_##TYPE(BAT *restrict bn, BAT *re bt[lo] = v; \ } \ } \ + bat_iterator_end(&li); \ } \ BATsetcount(bn, lo); \ return GDK_SUCCEED; \ @@ -166,7 +174,8 @@ project_loop(uuid) static gdk_return project_oid(BAT *restrict bn, BAT *restrict l, struct canditer *restrict lci, _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list