Changeset: 01757686adf9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/01757686adf9
Modified Files:
        gdk/gdk.h
Branch: default
Log Message:

Merge with Jul2021 branch.


diffs (146 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1148,59 +1148,6 @@ typedef var_t stridx_t;
 
 #include "gdk_cand.h"
 
-/* return the oid value at BUN position p from the (v)oid bat b
- * works with any TYPE_void or TYPE_oid bat */
-static inline oid
-BUNtoid(BAT *b, BUN p)
-{
-       oid o;
-
-       assert(ATOMtype(b->ttype) == TYPE_oid);
-       /* BATcount is the number of valid entries, so with
-        * exceptions, the last value can well be larger than
-        * b->tseqbase + BATcount(b) */
-       assert(p < BATcount(b));
-       assert(b->ttype == TYPE_void || b->tvheap == NULL);
-       if (is_oid_nil(b->tseqbase)) {
-               if (b->ttype == TYPE_void)
-                       return b->tseqbase; /* i.e. oid_nil */
-               MT_lock_set(&b->theaplock);
-               o = ((const oid *) b->theap->base)[p + b->tbaseoff];
-               MT_lock_unset(&b->theaplock);
-               return o;
-       }
-       o = b->tseqbase + p;
-       if (b->ttype == TYPE_oid || b->tvheap == NULL) {
-               return o;
-       }
-       /* b->tvheap != NULL, so we know there will be no parallel
-        * modifications (so no locking) */
-       assert(!mask_cand(b));
-       /* exceptions only allowed on transient BATs */
-       assert(b->batRole == TRANSIENT);
-       /* make sure exception area is a reasonable size */
-       assert(ccand_free(b) % SIZEOF_OID == 0);
-       BUN nexc = (BUN) (ccand_free(b) / SIZEOF_OID);
-       if (nexc == 0) {
-               /* no exceptions (why the vheap?) */
-               return o;
-       }
-       const oid *exc = (oid *) ccand_first(b);
-       if (o < exc[0])
-               return o;
-       if (o + nexc > exc[nexc - 1])
-               return o + nexc;
-       BUN lo = 0, hi = nexc - 1;
-       while (hi - lo > 1) {
-               BUN mid = (hi + lo) / 2;
-               if (exc[mid] - mid > o)
-                       hi = mid;
-               else
-                       lo = mid;
-       }
-       return o + hi;
-}
-
 /*
  * @- BAT properties
  * @multitable @columnfractions 0.08 0.7
@@ -1940,10 +1887,10 @@ BATdescriptor(bat i)
 static inline void *
 Tpos(BATiter *bi, BUN p)
 {
-       if (bi->h->base) {
-               bi->tvid = ((const oid *) bi->h->base)[p];
-       } else if (bi->vh) {
+       assert(bi->base == NULL);
+       if (bi->vh) {
                oid o;
+               assert(!is_oid_nil(bi->tseq));
                if (((ccand_t *) bi->vh)->type == CAND_NEGOID) {
                        BUN nexc = (bi->vh->free - sizeof(ccand_t)) / 
SIZEOF_OID;
                        o = bi->tseq + p;
@@ -1984,17 +1931,18 @@ Tpos(BATiter *bi, BUN p)
                        }
                }
                bi->tvid = o;
+       } else if (is_oid_nil(bi->tseq)) {
+               bi->tvid = oid_nil;
        } else {
                bi->tvid = bi->tseq + p;
        }
-       bi->tvid = BUNtoid(bi->b, p);
-       return (void*)&bi->tvid;
+       return (void *) &bi->tvid;
 }
 
 static inline bool
 Tmskval(BATiter *bi, BUN p)
 {
-       return ((uint32_t *) bi->h->base)[p / 32] & (1U << (p % 32));
+       return ((uint32_t *) bi->base)[p / 32] & (1U << (p % 32));
 }
 
 static inline void *
@@ -2004,6 +1952,34 @@ Tmsk(BATiter *bi, BUN p)
        return &bi->tmsk;
 }
 
+/* return the oid value at BUN position p from the (v)oid bat b
+ * works with any TYPE_void or TYPE_oid bat */
+static inline oid
+BUNtoid(BAT *b, BUN p)
+{
+       assert(ATOMtype(b->ttype) == TYPE_oid);
+       /* BATcount is the number of valid entries, so with
+        * exceptions, the last value can well be larger than
+        * b->tseqbase + BATcount(b) */
+       assert(p < BATcount(b));
+       assert(b->ttype == TYPE_void || b->tvheap == NULL);
+       if (is_oid_nil(b->tseqbase)) {
+               if (b->ttype == TYPE_void)
+                       return oid_nil;
+               MT_lock_set(&b->theaplock);
+               oid o = ((const oid *) b->theap->base)[p + b->tbaseoff];
+               MT_lock_unset(&b->theaplock);
+               return o;
+       }
+       if (b->ttype == TYPE_oid || b->tvheap == NULL) {
+               return b->tseqbase + p;
+       }
+       /* b->tvheap != NULL, so we know there will be no parallel
+        * modifications (so no locking) */
+       BATiter bi = bat_iterator_nolock(b);
+       return * (oid *) Tpos(&bi, p);
+}
+
 /*
  * @+ Transaction Management
  * @multitable @columnfractions 0.08 0.7
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -803,7 +803,7 @@ BATsave_locked(BAT *b, BATiter *bi, BUN 
        /* start saving data */
        nme = BBP_physical(b->batCacheid);
        const char *tail = gettailnamebi(bi);
-       if (bi->type != TYPE_void && bi->h->base == NULL) {
+       if (bi->type != TYPE_void && bi->base == NULL) {
                assert(BBP_status(b->batCacheid) & BBPSWAPPED);
                if (dosync && !(GDKdebug & NOSYNCMASK)) {
                        int fd = GDKfdlocate(bi->h->farmid, nme, "rb+", tail);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to