Changeset: 765c7d9cafb9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/765c7d9cafb9
Branch: default
Log Message:
merged
diffs (truncated from 1067 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2430,20 +2430,32 @@ gdk_export BAT *BATsample_with_seed(BAT
* on each iteration */
#define TIMEOUT_LOOP_IDX(IDX, REPEATS, TIMEOFFSET) \
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++, TIMEOFFSET =
GDKexiting() || (TIMEOFFSET > 0 && GDKusec() > TIMEOFFSET) ? -1 : TIMEOFFSET) \
- for (BUN CTR2 = 0, END2 = CTR1 == END1 - 1 ? REPS &
CHECK_QRY_TIMEOUT_MASK : CHECK_QRY_TIMEOUT_STEP; CTR2 < END2; CTR2++, IDX++)
+ 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; \
+ 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)
\
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++, TIMEOFFSET =
GDKexiting() || (TIMEOFFSET > 0 && GDKusec() > TIMEOFFSET) ? -1 : TIMEOFFSET) \
- for (BUN CTR2 = 0, END2 = CTR1 == END1 - 1 ? REPS &
CHECK_QRY_TIMEOUT_MASK : CHECK_QRY_TIMEOUT_STEP; CTR2 < END2; CTR2++, IDX++)
+ 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; \
+ 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++, TIMEOFFSET = GDKexiting() || (TIMEOFFSET > 0 && GDKusec() >
TIMEOFFSET) ? -1 : TIMEOFFSET) \
- for (BUN CTR2 = 0, END2 = CTR1 == END1 - 1 ? REPS &
CHECK_QRY_TIMEOUT_MASK : CHECK_QRY_TIMEOUT_STEP; CTR2 < END2; CTR2++)
+ 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; \
+ break; \
+ } else \
+ for (BUN CTR2 = 0, END2 = CTR1 == END1 - 1 ? REPS &
CHECK_QRY_TIMEOUT_MASK : CHECK_QRY_TIMEOUT_STEP; CTR2 < END2; CTR2++)
/* break out of the loop (cannot use do/while trick here) */
#define TIMEOUT_LOOP_BREAK \
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,
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]