Changeset: 6bfac24cef56 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6bfac24cef56
Branch: distinct_from
Log Message:

merge with default


diffs (truncated from 1041 to 300 lines):

diff --git a/gdk/ChangeLog.Dec2023 b/gdk/ChangeLog.Dec2023
--- a/gdk/ChangeLog.Dec2023
+++ b/gdk/ChangeLog.Dec2023
@@ -1,3 +1,7 @@
 # ChangeLog file for GDK
 # This file is updated with Maddlog
 
+* Mon Mar 18 2024 Sjoerd Mullender <sjo...@acm.org>
+- Fixed a couple of deadlock situations, one actually observed, one
+  never observed.
+
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2372,10 +2372,10 @@ gdk_export BAT *BATsample_with_seed(BAT 
 static inline void
 TIMEOUT_ERROR(QryCtx *qc, const char *file, const char *func, int lineno)
 {
-       if (GDKexiting())
+       if (GDKexiting()) {
                GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL,
                              "%s\n", EXITING_MSG);
-       else {
+       } else if (qc) {
                switch (qc->endtime) {
                case QRY_TIMEOUT:
                        GDKtracer_log(file, func, lineno, M_ERROR, GDK, NULL,
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -208,7 +208,6 @@ dofsum(const void *restrict values, oid 
        volatile flt f;
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       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);
@@ -719,7 +718,6 @@ dosum(const void *restrict values, bool 
        unsigned int *restrict seen = NULL; /* bitmask for groups that we've 
seen */
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        switch (tp2) {
        case TYPE_flt:
@@ -1359,7 +1357,6 @@ doprod(const void *restrict values, oid 
        unsigned int *restrict seen; /* bitmask for groups that we've seen */
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        /* allocate bitmap for seen group ids */
        seen = GDKzalloc(((ngrp + 31) / 32) * sizeof(int));
@@ -1818,7 +1815,6 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
        BATiter bi = {0};
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
@@ -2008,7 +2004,6 @@ BATgroupavg3(BAT **avgp, BAT **remp, BAT
        oid o;
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, &ci)) != 
NULL) {
                GDKerror("%s\n", err);
@@ -2646,7 +2641,6 @@ BATgroupavg3combine(BAT *avg, BAT *rem, 
        BAT *bn, *rn, *cn;
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        if ((err = BATgroupaggrinit(avg, g, e, NULL, &min, &max, &ngrp, &ci)) 
!= NULL) {
                GDKerror("%s\n", err);
@@ -3003,7 +2997,6 @@ BATcalcavg(BAT *b, BAT *s, dbl *avg, BUN
        const void *restrict src;
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        canditer_init(&ci, b, s);
 
@@ -3090,7 +3083,6 @@ BATgroupcount(BAT *b, BAT *g, BAT *e, BA
        BATiter bi = {0};
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
@@ -3263,7 +3255,6 @@ do_groupmin(oid *restrict oids, BATiter 
        int (*atomcmp)(const void *, const void *);
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        nils = ngrp;
        TIMEOUT_LOOP_IDX(i, ngrp, qry_ctx)
@@ -3386,7 +3377,6 @@ do_groupmax(oid *restrict oids, BATiter 
        int (*atomcmp)(const void *, const void *);
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        nils = ngrp;
        TIMEOUT_LOOP_IDX(i, ngrp, qry_ctx)
@@ -3984,7 +3974,6 @@ doBATgroupquantile(BAT *b, BAT *g, BAT *
 
        size_t counter = 0;
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
@@ -4366,7 +4355,6 @@ calcvariance(dbl *restrict avgp, const v
        dbl delta;
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        switch (tp) {
        case TYPE_bte:
@@ -4493,7 +4481,6 @@ calccovariance(const void *v1, const voi
        dbl mean1 = 0, mean2 = 0, m2 = 0, delta1, delta2;
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
 
        switch (tp) {
@@ -4597,7 +4584,6 @@ BATcalccorrelation(BAT *b1, BAT *b2)
        lng t0 = 0;
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
@@ -4714,7 +4700,6 @@ dogroupstdev(BAT **avgb, BAT *b, BAT *g,
        BATiter bi = {0};
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
@@ -4952,7 +4937,6 @@ dogroupcovariance(BAT *b1, BAT *b2, BAT 
        BATiter b1i = {0}, b2i = {0};
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
@@ -5158,7 +5142,6 @@ BATgroupcorrelation(BAT *b1, BAT *b2, BA
        BATiter b1i = {0}, b2i = {0};
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -814,8 +814,7 @@ COLcopy(BAT *b, int tt, bool writable, r
                return NULL;
        }
 
-       MT_lock_set(&b->theaplock);
-       bi = bat_iterator_nolock(b);
+       bi = bat_iterator(b);
 
        /* first try case (1); create a view, possibly with different
         * atom-types */
@@ -823,12 +822,12 @@ COLcopy(BAT *b, int tt, bool writable, r
            role == TRANSIENT &&
            bi.restricted == BAT_READ &&
            ATOMstorage(b->ttype) != TYPE_msk && /* no view on TYPE_msk */
-           (!VIEWtparent(b) ||
-            BBP_desc(VIEWtparent(b))->batRestricted == BAT_READ)) {
-               MT_lock_unset(&b->theaplock);
+           (bi.h == NULL ||
+            bi.h->parentid == b->batCacheid ||
+            BBP_desc(bi.h->parentid)->batRestricted == BAT_READ)) {
                bn = VIEWcreate(b->hseqbase, b);
                if (bn == NULL) {
-                       return NULL;
+                       goto bunins_failed;
                }
                if (tt != bn->ttype) {
                        bn->ttype = tt;
@@ -840,6 +839,7 @@ COLcopy(BAT *b, int tt, bool writable, r
                        }
                        bn->tseqbase = ATOMtype(tt) == TYPE_oid ? bi.tseq : 
oid_nil;
                }
+               bat_iterator_end(&bi);
                return bn;
        } else {
                /* check whether we need case (4); BUN-by-BUN copy (by
@@ -867,8 +867,7 @@ COLcopy(BAT *b, int tt, bool writable, r
 
                bn = COLnew2(b->hseqbase, tt, bi.count, role, bi.width);
                if (bn == NULL) {
-                       MT_lock_unset(&b->theaplock);
-                       return NULL;
+                       goto bunins_failed;
                }
                if (bn->tvheap != NULL && bn->tvheap->base == NULL) {
                        /* this combination can happen since the last
@@ -906,15 +905,16 @@ COLcopy(BAT *b, int tt, bool writable, r
                                bn->batCapacity = 0;
                } else if (BATatoms[tt].atomFix || tt != TYPE_void || 
ATOMextern(tt)) {
                        /* case (4): one-by-one BUN insert (really slow) */
-                       BUN p, q;
+                       QryCtx *qry_ctx = MT_thread_get_qry_ctx();
 
-                       BATloop(b, p, q) {
+                       TIMEOUT_LOOP_IDX_DECL(p, bi.count, qry_ctx) {
                                const void *t = BUNtail(bi, p);
 
                                if (bunfastapp_nocheck(bn, t) != GDK_SUCCEED) {
                                        goto bunins_failed;
                                }
                        }
+                       TIMEOUT_CHECK(qry_ctx, 
GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed, qry_ctx));
                        bn->theap->dirty |= bi.count > 0;
                } else if (tt != TYPE_void && bi.type == TYPE_void) {
                        /* case (4): optimized for unary void
@@ -951,7 +951,7 @@ COLcopy(BAT *b, int tt, bool writable, r
                } else {
                        BATtseqbase(bn, oid_nil);
                }
-               BATkey(bn, BATtkey(b));
+               BATkey(bn, bi.key);
                bn->tsorted = bi.sorted;
                bn->trevsorted = bi.revsorted;
                bn->tnorevsorted = bi.norevsorted;
@@ -969,7 +969,7 @@ COLcopy(BAT *b, int tt, bool writable, r
                bn->tunique_est = bi.unique_est;
        } else if (ATOMstorage(tt) == ATOMstorage(b->ttype) &&
                   ATOMcompare(tt) == ATOMcompare(b->ttype)) {
-               BUN h = BATcount(b);
+               BUN h = bi.count;
                bn->tsorted = bi.sorted;
                bn->trevsorted = bi.revsorted;
                BATkey(bn, bi.key);
@@ -1006,14 +1006,14 @@ COLcopy(BAT *b, int tt, bool writable, r
                bn->trevsorted = ATOMlinear(b->ttype);
                bn->tkey = true;
        }
+       bat_iterator_end(&bi);
        if (!writable)
                bn->batRestricted = BAT_READ;
        TRC_DEBUG(ALGO, ALGOBATFMT " -> " ALGOBATFMT "\n",
                  ALGOBATPAR(b), ALGOBATPAR(bn));
-       MT_lock_unset(&b->theaplock);
        return bn;
       bunins_failed:
-       MT_lock_unset(&b->theaplock);
+       bat_iterator_end(&bi);
        BBPreclaim(bn);
        return NULL;
 }
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -703,7 +703,6 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
        }
 
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
 
        BATiter ni = bat_iterator(n);
 
@@ -739,6 +738,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                    atomcmp(BUNtail(ni, ni.minpos), minbound) < 0) {
                        assert(0);
                        GDKerror("value out of bounds\n");
+                       MT_lock_unset(&b->theaplock);
                        goto bailout;
                }
        }
@@ -750,6 +750,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                    atomcmp(BUNtail(ni, ni.maxpos), maxbound) >= 0) {
                        assert(0);
                        GDKerror("value out of bounds\n");
+                       MT_lock_unset(&b->theaplock);
                        goto bailout;
                }
        }
@@ -802,6 +803,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                                if (minbound && n->tseqbase + ci.seq - hseq < 
*(const oid *)minbound) {
                                        assert(0);
                                        GDKerror("value not within bounds\n");
+                                       MT_lock_unset(&b->theaplock);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to