Changeset: bc93cebd6cd5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bc93cebd6cd5
Modified Files:
        gdk/gdk_aggr.c
        gdk/gdk_batop.c
        gdk/gdk_calc_convert.c
        gdk/gdk_string.c
Branch: Jun2023
Log Message:

Replace almost all CAND_LOOP calls to TIMEOUT_LOOP calls.
This way, the calling functions also obey the timeout.


diffs (truncated from 913 to 300 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -2008,6 +2008,12 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        BUN i;
        oid o;
 
+       lng timeoffset = 0;
+       QryCtx *qry_ctx = MT_thread_get_qry_ctx();
+       if (qry_ctx != NULL) {
+               timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? 
(qry_ctx->starttime + qry_ctx->querytimeout) : 0;
+       }
+
        if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, &ci)) != 
NULL) {
                GDKerror("%s\n", err);
                return GDK_FAIL;
@@ -2053,7 +2059,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        case TYPE_bte: {
                const bte *vals = (const bte *) bi.base;
                bte *avgs = Tloc(bn, 0);
-               CAND_LOOP(&ci) {
+               TIMEOUT_LOOP(ci.ncand, timeoffset) {
                        o = canditer_next(&ci) - b->hseqbase;
                        if (ngrp > 1)
                                gid = gids ? gids[o] - min : o;
@@ -2070,7 +2076,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
                                AVERAGE_ITER(bte, vals[o], avgs[gid], 
rems[gid], cnts[gid]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = bte_nil;
                                bn->tnil = true;
@@ -2101,7 +2107,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        case TYPE_sht: {
                const sht *vals = (const sht *) bi.base;
                sht *avgs = Tloc(bn, 0);
-               CAND_LOOP(&ci) {
+               TIMEOUT_LOOP(ci.ncand, timeoffset) {
                        o = canditer_next(&ci) - b->hseqbase;
                        if (ngrp > 1)
                                gid = gids ? gids[o] - min : o;
@@ -2118,7 +2124,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
                                AVERAGE_ITER(sht, vals[o], avgs[gid], 
rems[gid], cnts[gid]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = sht_nil;
                                bn->tnil = true;
@@ -2149,7 +2155,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        case TYPE_int: {
                const int *vals = (const int *) bi.base;
                int *avgs = Tloc(bn, 0);
-               CAND_LOOP(&ci) {
+               TIMEOUT_LOOP(ci.ncand, timeoffset) {
                        o = canditer_next(&ci) - b->hseqbase;
                        if (ngrp > 1)
                                gid = gids ? gids[o] - min : o;
@@ -2166,7 +2172,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
                                AVERAGE_ITER(int, vals[o], avgs[gid], 
rems[gid], cnts[gid]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = int_nil;
                                bn->tnil = true;
@@ -2197,7 +2203,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        case TYPE_lng: {
                const lng *vals = (const lng *) bi.base;
                lng *avgs = Tloc(bn, 0);
-               CAND_LOOP(&ci) {
+               TIMEOUT_LOOP(ci.ncand, timeoffset) {
                        o = canditer_next(&ci) - b->hseqbase;
                        if (ngrp > 1)
                                gid = gids ? gids[o] - min : o;
@@ -2214,7 +2220,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
                                AVERAGE_ITER(lng, vals[o], avgs[gid], 
rems[gid], cnts[gid]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = lng_nil;
                                bn->tnil = true;
@@ -2246,7 +2252,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        case TYPE_hge: {
                const hge *vals = (const hge *) bi.base;
                hge *avgs = Tloc(bn, 0);
-               CAND_LOOP(&ci) {
+               TIMEOUT_LOOP(ci.ncand, timeoffset) {
                        o = canditer_next(&ci) - b->hseqbase;
                        if (ngrp > 1)
                                gid = gids ? gids[o] - min : o;
@@ -2263,7 +2269,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
                                AVERAGE_ITER(hge, vals[o], avgs[gid], 
rems[gid], cnts[gid]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = hge_nil;
                                bn->tnil = true;
@@ -2294,6 +2300,7 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
 #endif
        }
        bat_iterator_end(&bi);
+       TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout));
        BATsetcount(bn, ngrp);
        BATsetcount(rn, ngrp);
        BATsetcount(cn, ngrp);
@@ -2307,6 +2314,12 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        *remp = rn;
        *cntp = cn;
        return GDK_SUCCEED;
+
+  bailout:
+       BBPreclaim(bn);
+       BBPreclaim(rn);
+       BBPreclaim(cn);
+       return GDK_FAIL;
 }
 
 #ifdef HAVE_HGE
@@ -2636,6 +2649,12 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        BUN i;
        BAT *bn, *rn, *cn;
 
+       lng timeoffset = 0;
+       QryCtx *qry_ctx = MT_thread_get_qry_ctx();
+       if (qry_ctx != NULL) {
+               timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? 
(qry_ctx->starttime + qry_ctx->querytimeout) : 0;
+       }
+
        if ((err = BATgroupaggrinit(avg, g, e, NULL, &min, &max, &ngrp, &ci)) 
!= NULL) {
                GDKerror("%s\n", err);
                return NULL;
@@ -2675,7 +2694,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        case TYPE_bte: {
                const bte *vals = (const bte *) bi.base;
                bte *avgs = Tloc(bn, 0);
-               CAND_LOOP_IDX(&ci, i) {
+               TIMEOUT_LOOP_IDX(i, ci.ncand, timeoffset) {
                        if (ngrp > 1)
                                gid = gids ? gids[i] - min : i;
                        if (is_bte_nil(vals[i])) {
@@ -2691,7 +2710,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                                                     ocnts[i]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = bte_nil;
                                bn->tnil = true;
@@ -2716,7 +2735,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        case TYPE_sht: {
                const sht *vals = (const sht *) bi.base;
                sht *avgs = Tloc(bn, 0);
-               CAND_LOOP_IDX(&ci, i) {
+               TIMEOUT_LOOP_IDX(i, ci.ncand, timeoffset) {
                        if (ngrp > 1)
                                gid = gids ? gids[i] - min : i;
                        if (is_sht_nil(vals[i])) {
@@ -2732,7 +2751,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                                                     ocnts[i]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = sht_nil;
                                bn->tnil = true;
@@ -2757,7 +2776,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        case TYPE_int: {
                const int *vals = (const int *) bi.base;
                int *avgs = Tloc(bn, 0);
-               CAND_LOOP_IDX(&ci, i) {
+               TIMEOUT_LOOP_IDX(i, ci.ncand, timeoffset) {
                        if (ngrp > 1)
                                gid = gids ? gids[i] - min : i;
                        if (is_int_nil(vals[i])) {
@@ -2773,7 +2792,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                                                     ocnts[i]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = int_nil;
                                bn->tnil = true;
@@ -2798,7 +2817,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        case TYPE_lng: {
                const lng *vals = (const lng *) bi.base;
                lng *avgs = Tloc(bn, 0);
-               CAND_LOOP_IDX(&ci, i) {
+               TIMEOUT_LOOP_IDX(i, ci.ncand, timeoffset) {
                        if (ngrp > 1)
                                gid = gids ? gids[i] - min : i;
                        if (is_lng_nil(vals[i])) {
@@ -2814,7 +2833,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                                                     ocnts[i]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = lng_nil;
                                bn->tnil = true;
@@ -2840,7 +2859,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        case TYPE_hge: {
                const hge *vals = (const hge *) bi.base;
                hge *avgs = Tloc(bn, 0);
-               CAND_LOOP_IDX(&ci, i) {
+               TIMEOUT_LOOP_IDX(i, ci.ncand, timeoffset) {
                        if (ngrp > 1)
                                gid = gids ? gids[i] - min : i;
                        if (is_hge_nil(vals[i])) {
@@ -2856,7 +2875,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                                                     ocnts[i]);
                        }
                }
-               for (i = 0; i < ngrp; i++) {
+               TIMEOUT_LOOP_IDX(i, ngrp, timeoffset) {
                        if (cnts[i] == 0) {
                                avgs[i] = hge_nil;
                                bn->tnil = true;
@@ -2883,12 +2902,17 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        bat_iterator_end(&bi);
        BBPreclaim(rn);
        BBPreclaim(cn);
+       TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout));
        BATsetcount(bn, ngrp);
        bn->tnonil = !bn->tnil;
        bn->tkey = ngrp == 1;
        bn->tsorted = ngrp == 1;
        bn->trevsorted = ngrp == 1;
        return bn;
+
+  bailout:
+       BBPreclaim(bn);
+       return NULL;
 }
 
 #define AVERAGE_TYPE_LNG_HGE(TYPE,lng_hge)                             \
@@ -2909,8 +2933,6 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                        /* don't count value until after overflow check */ \
                        n++;                                            \
                }                                                       \
-               TIMEOUT_CHECK(timeoffset,                               \
-                             GOTO_LABEL_TIMEOUT_HANDLER(bailout));     \
                /* the sum fit, so now we can calculate the average */  \
                *avg = n > 0 ? (dbl) sum / n : dbl_nil;                 \
                if (0) {                                                \
@@ -2936,7 +2958,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                                        r = n - r;                      \
                                }                                       \
                        }                                               \
-                       CAND_LOOP(&ci) {                                \
+                       TIMEOUT_LOOP(ci.ncand, timeoffset) {            \
                                /* loop invariant: */                   \
                                /* a + r/n == average(x[0],...,x[n]); */ \
                                /* 0 <= r < n */                        \
@@ -2948,6 +2970,8 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
                        }                                               \
                        *avg = a + (dbl) r / n;                         \
                }                                                       \
+               TIMEOUT_CHECK(timeoffset,                               \
+                             GOTO_LABEL_TIMEOUT_HANDLER(bailout));     \
        } while (0)
 
 #ifdef HAVE_HGE
@@ -3055,8 +3079,6 @@ bailout:
                                }                                       \
                        }                                               \
                }                                                       \
-               TIMEOUT_CHECK(timeoffset,                               \
-                             GOTO_LABEL_TIMEOUT_HANDLER(bailout));     \
        } while (0)
 
 /* calculate group counts with optional candidates list */
@@ -3119,13 +3141,13 @@ BATgroupcount(BAT *b, BAT *g, BAT *e, BA
                /* if nils are nothing special, or if there are no
                 * nils, we don't need to look at the values at all */
                if (gids) {
-                       CAND_LOOP(&ci) {
+                       TIMEOUT_LOOP(ci.ncand, timeoffset) {
                                i = canditer_next(&ci) - b->hseqbase;
                                if (gids[i] >= min && gids[i] <= max)
                                        cnts[gids[i] - min]++;
                        }
                } else {
-                       CAND_LOOP(&ci) {
+                       TIMEOUT_LOOP(ci.ncand, timeoffset) {
                                i = canditer_next(&ci) - b->hseqbase;
                                cnts[i] = 1;
                        }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to