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

Reply via email to