Changeset: 18264ca00859 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/18264ca00859
Modified Files:
        gdk/gdk_select.c
Branch: qcancel
Log Message:

Converted BATselect to new timeout loops.


diffs (274 lines):

diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -400,8 +400,7 @@ hashselect(BAT *b, struct canditer *rest
        do {                                                            \
                *algo = "select: " #NAME " " #TEST " (" #canditer_next ")"; \
                if (BATcapacity(bn) < maximum) {                        \
-                       for (p = 0; p < ci->ncand; p++) {               \
-                               GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE)); \
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {    \
                                o = canditer_next(ci);                  \
                                v = src[o-hseq];                        \
                                if (TEST) {                             \
@@ -413,8 +412,7 @@ hashselect(BAT *b, struct canditer *rest
                                }                                       \
                        }                                               \
                } else {                                                \
-                       for (p = 0; p < ci->ncand; p++) {               \
-                               GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE)); \
+                       TIMEOUT_LOOP(ci->ncand, timeoffset) {           \
                                o = canditer_next(ci);                  \
                                v = src[o-hseq];                        \
                                assert(cnt < BATcapacity(bn));          \
@@ -422,6 +420,7 @@ hashselect(BAT *b, struct canditer *rest
                                cnt += (TEST) != 0;                     \
                        }                                               \
                }                                                       \
+               TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
        } while (false)
 
 /* argument list for type-specific core scan select function call */
@@ -574,7 +573,6 @@ fullscan_any(BAT *b, struct canditer *re
        (void) maximum;
        (void) use_imprints;
        (void) lnil;
-       size_t counter = 0;
        lng timeoffset = 0;
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
        if (qry_ctx != NULL) {
@@ -584,8 +582,7 @@ fullscan_any(BAT *b, struct canditer *re
        if (equi) {
                *algo = "select: fullscan equi";
                if (ci->tpe == cand_dense) {
-                       for (p = 0; p < ci->ncand; p++) {
-                               GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next_dense(ci);
                                v = BUNtail(bi, o-hseq);
                                if ((*cmp)(tl, v) == 0) {
@@ -597,8 +594,7 @@ fullscan_any(BAT *b, struct canditer *re
                                }
                        }
                } else {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next(ci);
                                v = BUNtail(bi, o-hseq);
                                if ((*cmp)(tl, v) == 0) {
@@ -613,8 +609,7 @@ fullscan_any(BAT *b, struct canditer *re
        } else if (anti) {
                *algo = "select: fullscan anti";
                if (ci->tpe == cand_dense) {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next_dense(ci);
                                v = BUNtail(bi, o-hseq);
                                if ((nil == NULL || (*cmp)(v, nil) != 0) &&
@@ -632,8 +627,7 @@ fullscan_any(BAT *b, struct canditer *re
                                }
                        }
                } else {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next(ci);
                                v = BUNtail(bi, o-hseq);
                                if ((nil == NULL || (*cmp)(v, nil) != 0) &&
@@ -654,7 +648,7 @@ fullscan_any(BAT *b, struct canditer *re
        } else {
                *algo = "select: fullscan range";
                if (ci->tpe == cand_dense) {
-                       for (p = 0; p < ci->ncand; p++) {
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next_dense(ci);
                                v = BUNtail(bi, o-hseq);
                                if ((nil == NULL || (*cmp)(v, nil) != 0) &&
@@ -672,7 +666,7 @@ fullscan_any(BAT *b, struct canditer *re
                                }
                        }
                } else {
-                       for (p = 0; p < ci->ncand; p++) {
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next(ci);
                                v = BUNtail(bi, o-hseq);
                                if ((nil == NULL || (*cmp)(v, nil) != 0) &&
@@ -691,7 +685,11 @@ fullscan_any(BAT *b, struct canditer *re
                        }
                }
        }
+       TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout));
        return cnt;
+  bailout:
+       BBPreclaim(bn);
+       return BUN_NONE;
 }
 
 static BUN
@@ -704,7 +702,6 @@ fullscan_str(BAT *b, struct canditer *re
        var_t pos;
        BUN p;
        oid o;
-       size_t counter = 0;
        lng timeoffset = 0;
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
        if (qry_ctx != NULL) {
@@ -726,8 +723,7 @@ fullscan_str(BAT *b, struct canditer *re
                const unsigned char *ptr = (const unsigned char *) Tloc(b, 0);
                pos -= GDK_VAROFFSET;
                if (ci->tpe == cand_dense) {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next_dense(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -738,8 +734,7 @@ fullscan_str(BAT *b, struct canditer *re
                                }
                        }
                } else {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -756,8 +751,7 @@ fullscan_str(BAT *b, struct canditer *re
                const unsigned short *ptr = (const unsigned short *) Tloc(b, 0);
                pos -= GDK_VAROFFSET;
                if (ci->tpe == cand_dense) {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next_dense(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -768,8 +762,7 @@ fullscan_str(BAT *b, struct canditer *re
                                }
                        }
                } else {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -786,8 +779,7 @@ fullscan_str(BAT *b, struct canditer *re
        case 4: {
                const unsigned int *ptr = (const unsigned int *) Tloc(b, 0);
                if (ci->tpe == cand_dense) {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next_dense(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -798,8 +790,7 @@ fullscan_str(BAT *b, struct canditer *re
                                }
                        }
                } else {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -816,8 +807,7 @@ fullscan_str(BAT *b, struct canditer *re
        default: {
                const var_t *ptr = (const var_t *) Tloc(b, 0);
                if (ci->tpe == cand_dense) {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next_dense(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -828,8 +818,7 @@ fullscan_str(BAT *b, struct canditer *re
                                }
                        }
                } else {
-                       for (p = 0; p < ci->ncand; p++) {
-                           GDK_CHECK_TIMEOUT(timeoffset, counter, 
TIMEOUT_HANDLER(BUN_NONE));
+                       TIMEOUT_LOOP_IDX(p, ci->ncand, timeoffset) {
                                o = canditer_next(ci);
                                if (ptr[o - hseq] == pos) {
                                        buninsfix(bn, dst, cnt, o,
@@ -843,7 +832,11 @@ fullscan_str(BAT *b, struct canditer *re
                break;
        }
        }
+       TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout));
        return cnt;
+  bailout:
+       BBPreclaim(bn);
+       return BUN_NONE;
 }
 
 /* scan select type switch */
@@ -1943,7 +1936,6 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
        bool use_orderidx = false;
        const char *algo = NULL;
 
-       size_t counter = 0;
        lng timeoffset = 0;
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
        if (qry_ctx != NULL) {
@@ -2009,9 +2001,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
        if (!anti && !symmetric && (BATordered(l) || BATordered_rev(l) || 
use_orderidx)) {
                /* left column is sorted, use binary search */
                sorted = 2;
-               for (BUN i = 0; i < rci->ncand; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       GOTO_LABEL_TIMEOUT_HANDLER(bailout));
+               TIMEOUT_LOOP(rci->ncand, timeoffset) {
                        BUN low, high;
 
                        ro = canditer_next(rci);
@@ -2123,6 +2113,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
                                }
                        }
                }
+               TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                cnt = BATcount(r1);
                assert(r2 == NULL || BATcount(r1) == BATcount(r2));
        } else if (!anti && !symmetric &&
@@ -2144,9 +2135,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
 
                sorted = 2;
                cnt = 0;
-               for (BUN i = 0; i < rci->ncand; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       GOTO_LABEL_TIMEOUT_HANDLER(bailout));
+               TIMEOUT_LOOP_IDX_DECL(i, rci->ncand, timeoffset) {
                        maxsize = cnt + (rci->ncand - i) * lci->ncand;
                        ro = canditer_next(rci);
                        if (rlvals) {
@@ -2408,6 +2397,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
                                cnt = ncnt;
                        }
                }
+               TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout));
        } else {
                /* nested loop implementation */
                const void *vl;
@@ -2418,9 +2408,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
                sorted = 1;
                lvals = l->ttype == TYPE_void ? NULL : (const char *) Tloc(l, 
0);
                vl = &lval;
-               for (BUN i = 0; i < lci->ncand; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       GOTO_LABEL_TIMEOUT_HANDLER(bailout));
+               TIMEOUT_LOOP(lci->ncand, timeoffset) {
                        oid lo;
 
                        lo = canditer_next(lci);
@@ -2470,6 +2458,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
                                }
                        }
                }
+               TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                cnt = BATcount(r1);
                assert(r2 == NULL || BATcount(r1) == BATcount(r2));
        }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to