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