Changeset: cf5926fc0714 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/cf5926fc0714 Modified Files: gdk/ChangeLog gdk/gdk.h gdk/gdk_aggr.c gdk/gdk_batop.c gdk/gdk_calc.c gdk/gdk_calc_addsub.c gdk/gdk_calc_compare.h gdk/gdk_calc_convert.c gdk/gdk_calc_div.c gdk/gdk_calc_mod.c gdk/gdk_calc_mul.c gdk/gdk_calc_private.h gdk/gdk_cross.c gdk/gdk_group.c gdk/gdk_hash.c gdk/gdk_join.c gdk/gdk_project.c gdk/gdk_select.c gdk/gdk_string.c gdk/gdk_system.h gdk/gdk_unique.c monetdb5/mal/mal_client.c monetdb5/mal/mal_client.h monetdb5/mal/mal_embedded.c monetdb5/mal/mal_interpreter.c monetdb5/mal/mal_session.c monetdb5/modules/atoms/str.c monetdb5/modules/mal/clients.c monetdb5/modules/mal/pcre.c sql/backends/monet5/sql.c sql/backends/monet5/sql_scenario.c sql/storage/store.c tools/monetdbe/monetdbe.c Branch: client_interrupts Log Message:
Changed timeout code a little. The query context (QryCtx) now contains the end time of the query instead of the timeout value. The TIMEOUT macros now get a pointer to the query context instead of the endtime (timeoffset) value as argument. diffs (truncated from 6120 to 300 lines): diff --git a/gdk/ChangeLog b/gdk/ChangeLog --- a/gdk/ChangeLog +++ b/gdk/ChangeLog @@ -1,3 +1,8 @@ # ChangeLog file for GDK # This file is updated with Maddlog +* Wed Jan 3 2024 Sjoerd Mullender <sjo...@acm.org> +- Made some changes to the TIMEOUT macros. Most importantly, they + now get a pointer to a QryCtx structure as argument instead of the + timeout value. + diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -2249,7 +2249,7 @@ gdk_export void VIEWbounds(BAT *b, BAT * * The first parameter is a BAT, the p and q are BUN pointers, where p * is the iteration variable. */ -#define BATloop(r, p, q) \ +#define BATloop(r, p, q) \ for (q = BATcount(r), p = 0; p < q; p++) /* @@ -2369,66 +2369,67 @@ gdk_export BAT *BATsample_with_seed(BAT return rtpe; \ } while(0) +#define TIMEOUT_TEST(QC) ((QC) && (QC)->endtime && GDKusec() > (QC)->endtime) + #define GOTO_LABEL_TIMEOUT_HANDLER(label) \ do { \ GDKerror("%s\n", GDKexiting() ? EXITING_MSG : TIMEOUT_MSG); \ goto label; \ } while(0) -#define GDK_CHECK_TIMEOUT_BODY(timeoffset, callback) \ - do { \ - if (GDKexiting() || \ - (timeoffset && GDKusec() > timeoffset)) { \ - callback; \ - } \ +#define GDK_CHECK_TIMEOUT_BODY(qc, callback) \ + do { \ + if (GDKexiting() || TIMEOUT_TEST(qc)) { \ + callback; \ + } \ } while (0) -#define GDK_CHECK_TIMEOUT(timeoffset, counter, callback) \ - do { \ - if (counter > CHECK_QRY_TIMEOUT_STEP) { \ - GDK_CHECK_TIMEOUT_BODY(timeoffset, callback); \ - counter = 0; \ - } else { \ - counter++; \ - } \ +#define GDK_CHECK_TIMEOUT(qc, counter, callback) \ + do { \ + if (counter > CHECK_QRY_TIMEOUT_STEP) { \ + GDK_CHECK_TIMEOUT_BODY(qc, callback); \ + counter = 0; \ + } else { \ + counter++; \ + } \ } while (0) /* here are some useful constructs to iterate a number of times (the * REPEATS argument--only evaluated once) and checking for a timeout - * every once in a while; the TIMEOFFSET value is a variable of type lng + * every once in a while; the QC->endtime value is a variable of type lng * which is either 0 or the GDKusec() compatible time after which the * loop should terminate; check for this condition after the loop using * the TIMEOUT_CHECK macro; in order to break out of any of these loops, * use TIMEOUT_LOOP_BREAK since plain break won't do it; it is perfectly * ok to use continue inside the body */ -/* use IDX as a loop variable, initializing it to 0 and incrementing it - * on each iteration */ -#define TIMEOUT_LOOP_IDX(IDX, REPEATS, TIMEOFFSET) \ +/* use IDX as a loop variable (already declared), initializing it to 0 + * and incrementing it on each iteration */ +#define TIMEOUT_LOOP_IDX(IDX, REPEATS, QC) \ for (BUN REPS = (IDX = 0, (REPEATS)); REPS > 0; REPS = 0) /* "loops" at most once */ \ - for (BUN CTR1 = 0, END1 = (REPS + CHECK_QRY_TIMEOUT_STEP) >> CHECK_QRY_TIMEOUT_SHIFT; CTR1 < END1 && TIMEOFFSET >= 0; CTR1++) \ - if (GDKexiting() || (TIMEOFFSET > 0 && GDKusec() > TIMEOFFSET)) { \ - TIMEOFFSET = -1; \ + for (BUN CTR1 = 0, END1 = (REPS + CHECK_QRY_TIMEOUT_STEP) >> CHECK_QRY_TIMEOUT_SHIFT; CTR1 < END1 && !GDKexiting() && ((QC) == NULL || (QC)->endtime >= 0); CTR1++) \ + if (TIMEOUT_TEST(QC)) { \ + (QC)->endtime = -1; \ break; \ } else \ for (BUN CTR2 = 0, END2 = CTR1 == END1 - 1 ? REPS & CHECK_QRY_TIMEOUT_MASK : CHECK_QRY_TIMEOUT_STEP; CTR2 < END2; CTR2++, IDX++) /* declare and use IDX as a loop variable, initializing it to 0 and * incrementing it on each iteration */ -#define TIMEOUT_LOOP_IDX_DECL(IDX, REPEATS, TIMEOFFSET) \ +#define TIMEOUT_LOOP_IDX_DECL(IDX, REPEATS, QC) \ for (BUN IDX = 0, REPS = (REPEATS); REPS > 0; REPS = 0) /* "loops" at most once */ \ - for (BUN CTR1 = 0, END1 = (REPS + CHECK_QRY_TIMEOUT_STEP) >> CHECK_QRY_TIMEOUT_SHIFT; CTR1 < END1 && TIMEOFFSET >= 0; CTR1++) \ - if (GDKexiting() || (TIMEOFFSET > 0 && GDKusec() > TIMEOFFSET)) { \ - TIMEOFFSET = -1; \ + for (BUN CTR1 = 0, END1 = (REPS + CHECK_QRY_TIMEOUT_STEP) >> CHECK_QRY_TIMEOUT_SHIFT; CTR1 < END1 && !GDKexiting() && ((QC) == NULL || (QC)->endtime >= 0); CTR1++) \ + if (TIMEOUT_TEST(QC)) { \ + (QC)->endtime = -1; \ break; \ } else \ for (BUN CTR2 = 0, END2 = CTR1 == END1 - 1 ? REPS & CHECK_QRY_TIMEOUT_MASK : CHECK_QRY_TIMEOUT_STEP; CTR2 < END2; CTR2++, IDX++) /* there is no user-visible loop variable */ -#define TIMEOUT_LOOP(REPEATS, TIMEOFFSET) \ - for (BUN CTR1 = 0, REPS = (REPEATS), END1 = (REPS + CHECK_QRY_TIMEOUT_STEP) >> CHECK_QRY_TIMEOUT_SHIFT; CTR1 < END1 && TIMEOFFSET >= 0; CTR1++) \ - if (GDKexiting() || (TIMEOFFSET > 0 && GDKusec() > TIMEOFFSET)) { \ - TIMEOFFSET = -1; \ +#define TIMEOUT_LOOP(REPEATS, QC) \ + for (BUN CTR1 = 0, REPS = (REPEATS), END1 = (REPS + CHECK_QRY_TIMEOUT_STEP) >> CHECK_QRY_TIMEOUT_SHIFT; CTR1 < END1 && !GDKexiting() && ((QC) == NULL || (QC)->endtime >= 0); CTR1++) \ + if (TIMEOUT_TEST(QC)) { \ + (QC)->endtime = -1; \ break; \ } else \ for (BUN CTR2 = 0, END2 = CTR1 == END1 - 1 ? REPS & CHECK_QRY_TIMEOUT_MASK : CHECK_QRY_TIMEOUT_STEP; CTR2 < END2; CTR2++) @@ -2442,10 +2443,10 @@ gdk_export BAT *BATsample_with_seed(BAT /* check whether a timeout occurred, and execute the CALLBACK argument * if it did */ -#define TIMEOUT_CHECK(TIMEOFFSET, CALLBACK) \ - do { \ - if (TIMEOFFSET == -1) \ - CALLBACK; \ +#define TIMEOUT_CHECK(QC, CALLBACK) \ + do { \ + if (GDKexiting() || ((QC) && (QC)->endtime == -1)) \ + CALLBACK; \ } while (0) typedef struct gdk_callback { diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -207,11 +207,8 @@ dofsum(const void *restrict values, oid BUN nils = 0; volatile flt f; - 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; - } + qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0}; /* we only deal with the two floating point types */ assert(tp1 == TYPE_flt || tp1 == TYPE_dbl); @@ -240,7 +237,7 @@ dofsum(const void *restrict values, oid return BUN_NONE; } } - TIMEOUT_LOOP(ci->ncand, timeoffset) { + TIMEOUT_LOOP(ci->ncand, qry_ctx) { listi = canditer_next(ci) - seqb; grp = gids ? gids[listi] : 0; if (grp < min || grp > max) @@ -304,7 +301,7 @@ dofsum(const void *restrict values, oid } pergroup[grp].npartials = i; } - TIMEOUT_CHECK(timeoffset, GOTO_LABEL_TIMEOUT_HANDLER(bailout)); + TIMEOUT_CHECK(qry_ctx, GOTO_LABEL_TIMEOUT_HANDLER(bailout)); for (grp = 0; grp < ngrp; grp++) { if (pergroup[grp].partials == NULL) continue; @@ -441,18 +438,18 @@ dofsum(const void *restrict values, oid sum = 0; \ if (nonil) { \ *seen = ci->ncand > 0; \ - TIMEOUT_LOOP_IDX(i, ci->ncand, timeoffset) { \ + TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \ x = vals[ci->seq + i - seqb]; \ ADD_WITH_CHECK(x, sum, \ TYPE2, sum, \ GDK_##TYPE2##_max, \ goto overflow); \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ } else { \ bool seenval = false; \ - TIMEOUT_LOOP_IDX(i, ci->ncand, timeoffset) { \ + TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \ x = vals[ci->seq + i - seqb]; \ if (is_##TYPE1##_nil(x)) { \ if (!skip_nils) { \ @@ -468,7 +465,7 @@ dofsum(const void *restrict values, oid seenval = true; \ } \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ *seen = seenval; \ } \ @@ -480,7 +477,7 @@ dofsum(const void *restrict values, oid bool seenval = false; \ *algo = "sum: with candidates, no groups"; \ sum = 0; \ - TIMEOUT_LOOP_IDX(i, ci->ncand, timeoffset) { \ + TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \ x = vals[canditer_next(ci) - seqb]; \ if (is_##TYPE1##_nil(x)) { \ if (!skip_nils) { \ @@ -496,14 +493,14 @@ dofsum(const void *restrict values, oid seenval = true; \ } \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ if (seenval) \ *sums = sum; \ } else if (ci->tpe == cand_dense) { \ /* multiple groups, no candidate list */ \ *algo = "sum: no candidates, with groups"; \ - TIMEOUT_LOOP_IDX(i, ci->ncand, timeoffset) { \ + TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \ if (gids == NULL || \ (gids[i] >= min && gids[i] <= max)) { \ gid = gids ? gids[i] - min : (oid) i; \ @@ -531,12 +528,12 @@ dofsum(const void *restrict values, oid } \ } \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ } else { \ /* multiple groups, with candidate list */ \ *algo = "sum: with candidates, with groups"; \ - TIMEOUT_LOOP(ci->ncand, timeoffset) { \ + TIMEOUT_LOOP(ci->ncand, qry_ctx) { \ i = canditer_next(ci) - seqb; \ if (gids == NULL || \ (gids[i] >= min && gids[i] <= max)) { \ @@ -565,7 +562,7 @@ dofsum(const void *restrict values, oid } \ } \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ } \ } while (0) @@ -581,15 +578,15 @@ dofsum(const void *restrict values, oid if (nonil) { \ *algo = "sum: no candidates, no groups, no nils, no overflow"; \ *seen = ci->ncand > 0; \ - TIMEOUT_LOOP_IDX(i, ci->ncand, timeoffset) { \ + TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \ sum += vals[ci->seq + i - seqb]; \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ } else { \ bool seenval = false; \ *algo = "sum: no candidates, no groups, no overflow"; \ - TIMEOUT_LOOP_IDX(i, ci->ncand, timeoffset) { \ + TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \ x = vals[ci->seq + i - seqb]; \ if (is_##TYPE1##_nil(x)) { \ if (!skip_nils) { \ @@ -602,7 +599,7 @@ dofsum(const void *restrict values, oid seenval = true; \ } \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ *seen = seenval; \ } \ @@ -614,7 +611,7 @@ dofsum(const void *restrict values, oid bool seenval = false; \ *algo = "sum: with candidates, no groups, no overflow"; \ sum = 0; \ - TIMEOUT_LOOP_IDX(i, ci->ncand, timeoffset) { \ + TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \ x = vals[canditer_next(ci) - seqb]; \ if (is_##TYPE1##_nil(x)) { \ if (!skip_nils) { \ @@ -627,7 +624,7 @@ dofsum(const void *restrict values, oid seenval = true; \ } \ } \ - TIMEOUT_CHECK(timeoffset, \ + TIMEOUT_CHECK(qry_ctx, \ GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \ if (seenval) \ *sums = sum; \ @@ -635,7 +632,7 @@ dofsum(const void *restrict values, oid /* multiple groups, no candidate list */ \ if (nonil) { \ _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org