Changeset: f2fad121b65e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f2fad121b65e
Modified Files:
        gdk/gdk_bat.c
Branch: Jan2022
Log Message:

Save min/max pos when reinitializing bat iterator after resize.


diffs (44 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1159,11 +1159,11 @@ BUNappendmulti(BAT *b, const void *value
                const void *atomnil = ATOMnilptr(b->ttype);
                const void *minvalp = NULL, *maxvalp = NULL;
                BATiter bi = bat_iterator_nolock(b);
-               if (bi.minpos != BUN_NONE)
-                       minvalp = BUNtail(bi, bi.minpos);
-               if (bi.maxpos != BUN_NONE)
-                       maxvalp = BUNtail(bi, bi.maxpos);
                if (b->tvarsized) {
+                       if (bi.minpos != BUN_NONE)
+                               minvalp = BUNtail(bi, bi.minpos);
+                       if (bi.maxpos != BUN_NONE)
+                               maxvalp = BUNtail(bi, bi.maxpos);
                        const void *vbase = b->tvheap->base;
                        for (BUN i = 0; i < count; i++) {
                                t = ((void **) values)[i];
@@ -1177,7 +1177,13 @@ BUNappendmulti(BAT *b, const void *value
                                         * updated (not if they were
                                         * initialized from t below, but
                                         * we don't know) */
+                                       BUN minpos = bi.minpos;
+                                       BUN maxpos = bi.maxpos;
+                                       MT_lock_set(&b->theaplock);
                                        bi = bat_iterator_nolock(b);
+                                       MT_lock_unset(&b->theaplock);
+                                       bi.minpos = minpos;
+                                       bi.maxpos = maxpos;
                                        vbase = b->tvheap->base;
                                        if (bi.minpos != BUN_NONE)
                                                minvalp = BUNtvar(bi, 
bi.minpos);
@@ -1222,6 +1228,10 @@ BUNappendmulti(BAT *b, const void *value
                                p++;
                        }
                } else {
+                       if (bi.minpos != BUN_NONE)
+                               minvalp = BUNtloc(bi, bi.minpos);
+                       if (bi.maxpos != BUN_NONE)
+                               maxvalp = BUNtloc(bi, bi.maxpos);
                        MT_rwlock_wrlock(&b->thashlock);
                        for (BUN i = 0; i < count; i++) {
                                t = (void *) ((char *) values + (i << 
b->tshift));
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to