Changeset: 71025861879e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=71025861879e
Modified Files:
        gdk/gdk.h
        gdk/gdk_cross.c
        gdk/gdk_join.c
Branch: qcancel
Log Message:

add cleanup callback handler


diffs (140 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2115,19 +2115,29 @@ gdk_export BAT *BATsample_with_seed(BAT 
 
 #define CHECK_QRY_TIMEOUT_STEP 10000
 
-#define GDK_CHECK_TIMEOUT(timeoffset, counter)                         \
+#define DEFAULT_TIMEOUT_HANDLER()                                      \
+       do {                                                            \
+               GDKerror("Timeout was reached!");                       \
+               return GDK_FAIL;                                        \
+       } while(0)
+
+#define GOTO_LABEL_TIMEOUT_HANDLER(label)                              \
+       do {                                                            \
+               goto label;                                             \
+       } while(0)
+
+#define GDK_CHECK_TIMEOUT(timeoffset, counter, callback)               \
        do {                                                            \
        if (timeoffset) {                                               \
                if (counter > CHECK_QRY_TIMEOUT_STEP) {                 \
                        if (GDKusec() > timeoffset) {                   \
-                               GDKerror("Timeout was reached!");       \
-                               return GDK_FAIL;                        \
+                               callback;                               \
                        }                                               \
                        counter = 0;                                    \
                } else {                                                \
                        counter++;                                      \
                }                                                       \
        }                                                               \
-       } while (false)
+       } while (0)
 
 #endif /* _GDK_H_ */
diff --git a/gdk/gdk_cross.c b/gdk/gdk_cross.c
--- a/gdk/gdk_cross.c
+++ b/gdk/gdk_cross.c
@@ -56,7 +56,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
                for (i = 0; i < cnt1; i++) {
                        oid x = canditer_next(&ci1);
                        for (j = 0; j < cnt2; j++) {
-                               GDK_CHECK_TIMEOUT(timeoffset, counter);
+                               GDK_CHECK_TIMEOUT(timeoffset, counter, 
DEFAULT_TIMEOUT_HANDLER());
                                *p++ = x;
                        }
                }
@@ -73,7 +73,7 @@ BATsubcross(BAT **r1p, BAT **r2p, BAT *l
                        counter = 0;
                        for (i = 0; i < cnt1; i++) {
                                for (j = 0; j < cnt2; j++) {
-                                       GDK_CHECK_TIMEOUT(timeoffset, counter);
+                                       GDK_CHECK_TIMEOUT(timeoffset, counter, 
DEFAULT_TIMEOUT_HANDLER());
                                        *p++ = canditer_next(&ci2);
                                }
                                canditer_reset(&ci2);
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -374,7 +374,8 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
                BUN p, q = BATcount(bn);
 
                do {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter);
+                       GDK_CHECK_TIMEOUT(timeoffset, counter,
+                                       DEFAULT_TIMEOUT_HANDLER());
                        for (p = 0; p < q; p++) {
                                *o1p++ = o;
                        }
@@ -392,7 +393,8 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
                BUN p, q = BATcount(bn);
 
                do {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter);
+                       GDK_CHECK_TIMEOUT(timeoffset, counter,
+                                       DEFAULT_TIMEOUT_HANDLER());
                        for (p = 0; p < q; p++) {
                                *o1p++ = o;
                        }
@@ -847,7 +849,8 @@ mergejoin_int(BAT **r1p, BAT **r2p, BAT 
        /* from here on we don't have to worry about nil values */
 
        while (lstart < lend && rstart < rend) {
-               GDK_CHECK_TIMEOUT(timeoffset, counter);
+               GDK_CHECK_TIMEOUT(timeoffset, counter,
+                               GOTO_LABEL_TIMEOUT_HANDLER(bailout));
 
                v = rvals[rstart];
 
@@ -1151,7 +1154,8 @@ mergejoin_lng(BAT **r1p, BAT **r2p, BAT 
        /* from here on we don't have to worry about nil values */
 
        while (lstart < lend && rstart < rend) {
-               GDK_CHECK_TIMEOUT(timeoffset, counter);
+               GDK_CHECK_TIMEOUT(timeoffset, counter,
+                               GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                v = rvals[rstart];
 
                if (lscan < lend - lstart && lvals[lstart + lscan] < v) {
@@ -1453,7 +1457,8 @@ mergejoin_cand(BAT **r1p, BAT **r2p, BAT
        /* from here on we don't have to worry about nil values */
 
        while (lstart < lend && rci.next < rci.ncand) {
-               GDK_CHECK_TIMEOUT(timeoffset, counter);
+               GDK_CHECK_TIMEOUT(timeoffset, counter,
+                               GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                v = canditer_peek(&rci);
 
                if (lvals) {
@@ -1862,7 +1867,8 @@ mergejoin(BAT **r1p, BAT **r2p, BAT *l, 
         * We will modify these as we go along.
         */
        while (lci->next < lci->ncand) {
-               GDK_CHECK_TIMEOUT(timeoffset, counter);
+               GDK_CHECK_TIMEOUT(timeoffset, counter,
+                               GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                if (lscan == 0) {
                        /* always search r completely */
                        assert(equal_order);
@@ -2420,7 +2426,7 @@ mergejoin(BAT **r1p, BAT **r2p, BAT *l, 
                TYPE *lvals = Tloc(l, 0);                               \
                TYPE v;                                                 \
                while (lci->next < lci->ncand) {                        \
-                       GDK_CHECK_TIMEOUT(timeoffset, counter);         \
+                       GDK_CHECK_TIMEOUT(timeoffset, counter, 
GOTO_LABEL_TIMEOUT_HANDLER(bailout));            \
                        lo = canditer_next(lci);                        \
                        v = lvals[lo - l->hseqbase];                    \
                        nr = 0;                                         \
@@ -2696,7 +2702,8 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                break;
        default:
                while (lci->next < lci->ncand) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter);
+                       GDK_CHECK_TIMEOUT(timeoffset, counter,
+                                       GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                        lo = canditer_next(lci);
                        if (BATtvoid(l)) {
                                if (BATtdense(l))
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to