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

hashselect


diffs (121 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2115,7 +2115,13 @@ gdk_export BAT *BATsample_with_seed(BAT 
 
 #define CHECK_QRY_TIMEOUT_STEP 10000
 
-#define DEFAULT_TIMEOUT_HANDLER()                                      \
+#define NULL_TIMEOUT_HANDLER()                                 \
+       do {                                                            \
+               GDKerror("Timeout was reached!");                       \
+               return NULL;                                    \
+       } while(0)
+
+#define GDK_FAIL_TIMEOUT_HANDLER()                                     \
        do {                                                            \
                GDKerror("Timeout was reached!");                       \
                return GDK_FAIL;                                        \
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, 
DEFAULT_TIMEOUT_HANDLER());
+                               GDK_CHECK_TIMEOUT(timeoffset, counter, 
GDK_FAIL_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, 
DEFAULT_TIMEOUT_HANDLER());
+                                       GDK_CHECK_TIMEOUT(timeoffset, counter, 
GDK_FAIL_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
@@ -375,7 +375,7 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
 
                do {
                        GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       DEFAULT_TIMEOUT_HANDLER());
+                                       GDK_FAIL_TIMEOUT_HANDLER());
                        for (p = 0; p < q; p++) {
                                *o1p++ = o;
                        }
@@ -394,7 +394,7 @@ selectjoin(BAT **r1p, BAT **r2p, BAT *l,
 
                do {
                        GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       DEFAULT_TIMEOUT_HANDLER());
+                                       GDK_FAIL_TIMEOUT_HANDLER());
                        for (p = 0; p < q; p++) {
                                *o1p++ = o;
                        }
@@ -716,7 +716,7 @@ mergejoin_void(BAT **r1p, BAT **r2p, BAT
        if (l->ttype == TYPE_void && l->tvheap != NULL) {
                for (i = 0; i < lci->ncand; i++) {
                        GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       DEFAULT_TIMEOUT_HANDLER());
+                                       GDK_FAIL_TIMEOUT_HANDLER());
                        oid c = canditer_next(lci);
 
                        o = BUNtoid(l, c - l->hseqbase);
@@ -732,7 +732,7 @@ mergejoin_void(BAT **r1p, BAT **r2p, BAT
        } else {
                for (i = 0; i < lci->ncand; i++) {
                        GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       DEFAULT_TIMEOUT_HANDLER());
+                                       GDK_FAIL_TIMEOUT_HANDLER());
                        oid c = canditer_next(lci);
 
                        o = lvals[c - l->hseqbase];
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -88,6 +88,10 @@ hashselect(BAT *b, struct canditer *rest
        oid seq;
        int (*cmp)(const void *, const void *);
 
+       size_t counter = 0;
+       QryCtx *qry_ctx = MT_thread_get_qry_ctx();
+       lng timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? 
(qry_ctx->starttime + qry_ctx->querytimeout) : 0;
+
        assert(bn->ttype == TYPE_oid);
        seq = b->hseqbase;
        l = ci->seq - seq;
@@ -126,6 +130,8 @@ hashselect(BAT *b, struct canditer *rest
        cnt = 0;
        if (ci->tpe != cand_dense) {
                HASHloop_bound(bi, b->thash, i, tl, l, h) {
+                       GDK_CHECK_TIMEOUT(timeoffset, counter,
+                                       GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                        o = (oid) (i + seq - d);
                        if (canditer_contains(ci, o)) {
                                buninsfix(bn, dst, cnt, o,
@@ -136,6 +142,8 @@ hashselect(BAT *b, struct canditer *rest
                }
        } else {
                HASHloop_bound(bi, b->thash, i, tl, l, h) {
+                       GDK_CHECK_TIMEOUT(timeoffset, counter,
+                                       GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                        o = (oid) (i + seq - d);
                        buninsfix(bn, dst, cnt, o,
                                  maximum - BATcapacity(bn),
@@ -158,6 +166,10 @@ hashselect(BAT *b, struct canditer *rest
        bn->trevsorted = bn->batCount <= 1;
        bn->tseqbase = bn->batCount == 0 ? 0 : bn->batCount == 1 ? *dst : 
oid_nil;
        return bn;
+
+  bailout:
+       BBPreclaim(bn);
+       return NULL;
 }
 
 /* Imprints select code */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to