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

Reply via email to