Changeset: 9d0e1c9e3201 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/9d0e1c9e3201 Branch: Jul2021 Log Message:
merged diffs (truncated from 9020 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -187,7 +187,7 @@ BAT *BATsample_with_seed(BAT *b, BUN n, gdk_return BATsave(BAT *b) __attribute__((__warn_unused_result__)); BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, bool li, bool hi, bool anti); gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, bool nil_matches, bool max_one, BUN estimate) __attribute__((__warn_unused_result__)); -gdk_return BATsetaccess(BAT *b, restrict_t mode); +BAT *BATsetaccess(BAT *b, restrict_t mode) __attribute__((__warn_unused_result__)); void BATsetcapacity(BAT *b, BUN cnt); void BATsetcount(BAT *b, BUN cnt); BAT *BATslice(BAT *b, BUN low, BUN high); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -776,14 +776,6 @@ typedef struct BAT { MT_Lock batIdxLock; /* lock to manipulate other indexes/properties */ } BAT; -typedef struct BATiter { - BAT *b; - union { - oid tvid; - bool tmsk; - }; -} BATiter; - /* macros to hide complexity of the BAT structure */ #define ttype T.type #define tkey T.key @@ -808,6 +800,25 @@ typedef struct BATiter { #define tprops T.props +typedef struct BATiter { + BAT *b; + Heap *h; + Heap *vh; + BUN baseoff; + BUN count; + uint16_t width; + uint8_t shift; + int8_t type; + oid tseq; + union { + oid tvid; + bool tmsk; + }; +#ifndef NDEBUG + bool locked; +#endif +} BATiter; + /* some access functions for the bitmask type */ static inline void mskSet(BAT *b, BUN p) @@ -879,6 +890,78 @@ gdk_export size_t HEAPmemsize(Heap *h); gdk_export void HEAPdecref(Heap *h, bool remove); gdk_export void HEAPincref(Heap *h); +static inline BATiter +bat_iterator(BAT *b) +{ + /* needs matching bat_iterator_end */ + BATiter bi; + if (b) { + MT_lock_set(&b->theaplock); + bi = (BATiter) { + .b = b, + .h = b->theap, + .vh = b->tvheap, + .baseoff = b->tbaseoff, + .count = b->batCount, + .width = b->twidth, + .shift = b->tshift, + .type = b->ttype, + .tseq = b->tseqbase, +#ifndef NDEBUG + .locked = true, +#endif + }; + HEAPincref(bi.h); + if (bi.vh) + HEAPincref(bi.vh); + MT_lock_unset(&b->theaplock); + } else { + bi = (BATiter) { + .b = NULL, +#ifndef NDEBUG + .locked = true, +#endif + }; + } + return bi; +} + +static inline void +bat_iterator_end(BATiter *bip) +{ + /* matches bat_iterator */ + assert(bip); + assert(bip->locked); + if (bip->h) + HEAPdecref(bip->h, false); + if (bip->vh) + HEAPdecref(bip->vh, false); + *bip = (BATiter) {0}; +} + +static inline BATiter +bat_iterator_nolock(BAT *b) +{ + /* does not get matched by bat_iterator_end */ + if (b) { + return (BATiter) { + .b = b, + .h = b->theap, + .vh = b->tvheap, + .baseoff = b->tbaseoff, + .count = b->batCount, + .width = b->twidth, + .shift = b->tshift, + .type = b->ttype, + .tseq = b->tseqbase, +#ifndef NDEBUG + .locked = false, +#endif + }; + } + return (BATiter) {0}; +} + /* * @- Internal HEAP Chunk Management * Heaps are used in BATs to store data for variable-size atoms. The @@ -1011,12 +1094,12 @@ typedef var_t stridx_t; #define SIZEOF_STRIDX_T SIZEOF_VAR_T #define GDK_VARALIGN SIZEOF_STRIDX_T -#define BUNtvaroff(bi,p) VarHeapVal(Tloc((bi).b, 0), (p), (bi).b->twidth) +#define BUNtvaroff(bi,p) VarHeapVal((bi).h->base + ((bi).baseoff << (bi).shift), (p), (bi).width) -#define BUNtloc(bi,p) (ATOMstorage((bi).b->ttype) == TYPE_msk ? Tmsk(&(bi), p) : Tloc((bi).b,p)) +#define BUNtloc(bi,p) (ATOMstorage((bi).type) == TYPE_msk ? Tmsk(&(bi), p) : (bi).h->base + (((bi).baseoff + (p)) << (bi).shift)) #define BUNtpos(bi,p) Tpos(&(bi),p) -#define BUNtvar(bi,p) (assert((bi).b->ttype && (bi).b->tvarsized), (void *) (Tbase((bi).b)+BUNtvaroff(bi,p))) -#define BUNtail(bi,p) ((bi).b->ttype?(bi).b->tvarsized?BUNtvar(bi,p):BUNtloc(bi,p):BUNtpos(bi,p)) +#define BUNtvar(bi,p) (assert((bi).type && (bi).b->tvarsized), (void *) ((bi).vh->base+BUNtvaroff(bi,p))) +#define BUNtail(bi,p) ((bi).type?(bi).b->tvarsized?BUNtvar(bi,p):BUNtloc(bi,p):BUNtpos(bi,p)) #define BUNlast(b) (assert((b)->batCount <= BUN_MAX), (b)->batCount) @@ -1072,8 +1155,6 @@ BUNtoid(BAT *b, BUN p) return o + hi; } -#define bat_iterator(_b) ((BATiter) {.b = (_b), .tvid = 0}) - /* * @- BAT properties * @multitable @columnfractions 0.08 0.7 @@ -1144,7 +1225,8 @@ typedef enum { BAT_APPEND, /* only reads and appends allowed */ } restrict_t; -gdk_export gdk_return BATsetaccess(BAT *b, restrict_t mode); +gdk_export BAT *BATsetaccess(BAT *b, restrict_t mode) + __attribute__((__warn_unused_result__)); gdk_export restrict_t BATgetaccess(BAT *b); @@ -1867,6 +1949,53 @@ 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) { + oid o; + if (((ccand_t *) bi->vh)->type == CAND_NEGOID) { + BUN nexc = (bi->vh->free - sizeof(ccand_t)) / SIZEOF_OID; + o = bi->tseq + p; + if (nexc > 0) { + const oid *exc = (const oid *) (bi->vh->base + sizeof(ccand_t)); + if (o >= exc[0]) { + if (o + nexc > exc[nexc - 1]) { + o += nexc; + } else { + BUN lo = 0; + BUN hi = nexc - 1; + while (hi - lo > 1) { + BUN mid = (hi + lo) / 2; + if (exc[mid] - mid > o) + hi = mid; + else + lo = mid; + } + o += hi; + } + } + } + } else { + const uint32_t *msk = (const uint32_t *) (bi->vh->base + sizeof(ccand_t)); + BUN nmsk = (bi->vh->free - sizeof(ccand_t)) / sizeof(uint32_t); + o = 0; + for (BUN i = 0; i < nmsk; i++) { + uint32_t m = candmask_pop(msk[i]); + if (o + m > p) { + m = msk[i]; + for (i = 0; i < 32; i++) { + if (m & (1U << i) && ++o == p) + break; + } + break; + } + o += m; + } + } + bi->tvid = o; + } else { + bi->tvid = bi->tseq + p; + } bi->tvid = BUNtoid(bi->b, p); return (void*)&bi->tvid; } @@ -1874,7 +2003,7 @@ Tpos(BATiter *bi, BUN p) static inline void * Tmsk(BATiter *bi, BUN p) { - bi->tmsk = mskGetVal(bi->b, p); + bi->tmsk = ((uint32_t *) bi->h->base)[p / 32] & (1U << (p % 32)); return &bi->tmsk; } @@ -2003,8 +2132,6 @@ gdk_export void BATundo(BAT *b); * @tab VIEWhparent (BAT *b) * @item bat * @tab VIEWtparent (BAT *b) - * @item BAT* - * @tab VIEWreset (BAT *b) * @end multitable * * Alignments of two columns of a BAT means that the system knows @@ -2022,10 +2149,6 @@ gdk_export void BATundo(BAT *b); * any) is returned by VIEWtparent (otherwise it returns 0). * * VIEW bats are read-only!! - * - * VIEWreset creates a normal BAT with the same contents as its view - * parameter (it converts void columns with seqbase!=nil to - * materialized oid columns). */ gdk_export int ALIGNsynced(BAT *b1, BAT *b2); diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -903,7 +903,7 @@ BATgroupsum(BAT *b, BAT *g, BAT *e, BAT return NULL; } - if (BATcount(b) == 0 || ngrp == 0) { + if (ncand == 0 || ngrp == 0) { /* trivial: no sums, so return bat aligned with g with * nil in the tail */ return BATconstant(ngrp == 0 ? 0 : min, tp, ATOMnilptr(tp), ngrp, TRANSIENT); @@ -927,9 +927,15 @@ BATgroupsum(BAT *b, BAT *g, BAT *e, BAT else gids = (const oid *) Tloc(g, 0); - nils = dosum(Tloc(b, 0), b->tnonil, b->hseqbase, &ci, ncand, + MT_lock_set(&b->theaplock); + Heap *h = b->theap; + HEAPincref(h); + BUN baseoff = b->tbaseoff; + MT_lock_unset(&b->theaplock); + nils = dosum(h->base + (baseoff << b->tshift), b->tnonil, b->hseqbase, &ci, ncand, Tloc(bn, 0), ngrp, b->ttype, tp, gids, min, max, skip_nils, abort_on_error, true, __func__, &algo); + HEAPdecref(h, false); if (nils < BUN_NONE) { BATsetcount(bn, ngrp); @@ -961,13 +967,21 @@ mskCountOnes(BAT *b, struct canditer *ci if (ci->s == NULL && mask_cand(b)) return BATcount(b); - if (ci->tpe == cand_dense && BATcount(b) && !mask_cand(b)) { - const uint32_t *restrict src = Tloc(b, (ci->seq - b->hseqbase) / 32); + if (ci->tpe == cand_dense && ncand > 0 && !mask_cand(b)) { + MT_lock_set(&b->theaplock); + Heap *h = b->theap; + BUN baseoff = b->tbaseoff; + HEAPincref(h); + MT_lock_unset(&b->theaplock); + const uint32_t *restrict src = (const uint32_t *) (h->base + baseoff + 4 * ((ci->seq - b->hseqbase) / 32)); int bits = (ci->seq - b->hseqbase) % 32; if (bits + ncand <= 32) { if (ncand == 32) - return candmask_pop(src[0]); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list