Changeset: e066094d5537 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e066094d5537
Modified Files:
gdk/gdk.h
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_group.c
gdk/gdk_hash.c
Branch: default
Log Message:
Merge with Jul2021 branch.
diffs (truncated from 709 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1696,6 +1696,12 @@ tfastins_nocheckVAR(BAT *b, BUN p, const
}
static inline gdk_return __attribute__((__warn_unused_result__))
+tfastins_nocheckFIX(BAT *b, BUN p, const void *v)
+{
+ return ATOMputFIX(b->ttype, Tloc(b, p), v);
+}
+
+static inline gdk_return __attribute__((__warn_unused_result__))
tfastins_nocheck(BAT *b, BUN p, const void *v)
{
assert(b->theap->parentid == b->batCacheid);
@@ -1707,7 +1713,7 @@ tfastins_nocheck(BAT *b, BUN p, const vo
} else if (b->tvarsized) {
return tfastins_nocheckVAR(b, p, v);
} else {
- return ATOMputFIX(b->ttype, Tloc(b, p), v);
+ return tfastins_nocheckFIX(b, p, v);
}
return GDK_SUCCEED;
}
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -70,7 +70,7 @@ GDKrebuild_segment_tree(oid ncount, oid
#define ANALYTICAL_NTILE(IMP, TPE, NEXT_VALUE, LNG_HGE, UPCAST, VALIDATION) \
do { \
- TPE *restrict rb = (TPE*)Tloc(r, 0); \
+ TPE *rb = (TPE*)Tloc(r, 0); \
if (p) { \
while (i < cnt) { \
if (np[i]) { \
@@ -197,7 +197,7 @@ invalidntile:
#define ANALYTICAL_FIRST_FIXED(TPE) \
do { \
const TPE *bp = (TPE*)bi.base; \
- TPE *restrict rb = (TPE*)Tloc(r, 0); \
+ TPE *rb = (TPE*)Tloc(r, 0); \
for (; k < cnt; k++) { \
const TPE *bs = bp + start[k], *be = bp + end[k]; \
TPE curval = (be > bs) ? *bs : TPE##_nil; \
@@ -279,7 +279,7 @@ GDKanalyticalfirst(BAT *r, BAT *b, BAT *
#define ANALYTICAL_LAST_FIXED(TPE) \
do { \
const TPE *bp = (TPE*)bi.base; \
- TPE *restrict rb = (TPE*)Tloc(r, 0); \
+ TPE *rb = (TPE*)Tloc(r, 0); \
for (; k < cnt; k++) { \
const TPE *bs = bp + start[k], *be = bp + end[k]; \
TPE curval = (be > bs) ? *(be - 1) : TPE##_nil; \
@@ -360,7 +360,7 @@ GDKanalyticallast(BAT *r, BAT *b, BAT *s
#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED(TPE) \
do { \
const TPE *bp = (TPE*)bi.base; \
- TPE *restrict rb = (TPE*)Tloc(r, 0); \
+ TPE *rb = (TPE*)Tloc(r, 0); \
if (is_lng_nil(nth)) { \
has_nils = true; \
for (; k < cnt; k++) \
@@ -380,7 +380,7 @@ GDKanalyticallast(BAT *r, BAT *b, BAT *s
#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE) \
do { \
const TPE *bp = (TPE*)bi.base; \
- TPE curval, *restrict rb = (TPE*)Tloc(r, 0); \
+ TPE curval, *rb = (TPE*)Tloc(r, 0); \
for (; k < cnt; k++) { \
lng lnth = tp[k]; \
const TPE *bs = bp + start[k]; \
@@ -1171,7 +1171,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
#define ANALYTICAL_MIN_MAX_PARTITIONS(TPE, MIN_MAX, IMP) \
do { \
- TPE *restrict bp = (TPE*)bi.base, *restrict rb = (TPE*)Tloc(r,
0); \
+ TPE *restrict bp = (TPE*)bi.base, *rb = (TPE*)Tloc(r, 0); \
if (p) { \
while (i < cnt) { \
if (np[i]) { \
@@ -1606,7 +1606,7 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
BATiter ei = bat_iterator(e);
oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start =
si.base, *restrict end = ei.base,
*levels_offset = NULL, tree_capacity = 0, nlevels = 0;
- lng curval = 0, *restrict rb = (lng *) Tloc(r, 0);
+ lng curval = 0, *rb = (lng *) Tloc(r, 0);
bit *np = pi.base, *op = oi.base;
const void *restrict nil = ATOMnilptr(tpe);
int (*cmp) (const void *, const void *) = ATOMcompare(tpe);
@@ -1787,7 +1787,7 @@ cleanup:
#define ANALYTICAL_SUM_CALC(TPE1, TPE2, IMP) \
do { \
TPE1 *restrict bp = (TPE1*)bi.base; \
- TPE2 *restrict rb = (TPE2*)Tloc(r, 0); \
+ TPE2 *rb = (TPE2*)Tloc(r, 0); \
if (p) { \
while (i < cnt) { \
if (np[i]) { \
@@ -2290,7 +2290,7 @@ nosupport:
#define ANALYTICAL_PROD_CALC_NUM_PARTITIONS(TPE1, TPE2, TPE3_OR_REAL_IMP, IMP)
\
do { \
TPE1 *restrict bp = (TPE1*)bi.base; \
- TPE2 *restrict rb = (TPE2*)Tloc(r, 0); \
+ TPE2 *rb = (TPE2*)Tloc(r, 0); \
if (p) { \
while (i < cnt) { \
if (np[i]) { \
@@ -2856,7 +2856,7 @@ GDKanalyticalavg(BAT *r, BAT *p, BAT *o,
oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start =
si.base, *restrict end = ei.base,
*levels_offset = NULL, tree_capacity = 0, nlevels = 0;
lng n = 0, rr = 0;
- dbl *restrict rb = (dbl *) Tloc(r, 0), curval = dbl_nil;
+ dbl *rb = (dbl *) Tloc(r, 0), curval = dbl_nil;
bit *np = pi.base, *op = oi.base;
bool abort_on_error = true;
BUN nils = 0;
@@ -3058,7 +3058,7 @@ avg_int_deltas(lng)
#define ANALYTICAL_AVG_INT_PARTITIONS(TPE, IMP)
\
do { \
- TPE *restrict bp = (TPE*)bi.base, *restrict rb = (TPE *)
Tloc(r, 0); \
+ TPE *restrict bp = (TPE*)bi.base, *rb = (TPE *) Tloc(r, 0); \
if (p) { \
while (i < cnt) { \
if (np[i]) { \
@@ -3382,7 +3382,7 @@ GDKanalytical_##NAME(BAT *r, BAT *p, BAT
*levels_offset = NULL, tree_capacity = 0, nlevels = 0; \
lng n = 0; \
bit *np = pi.base, *op = oi.base; \
- dbl *restrict rb = (dbl *) Tloc(r, 0), mean = 0, m2 = 0, delta; \
+ dbl *rb = (dbl *) Tloc(r, 0), mean = 0, m2 = 0, delta; \
void *segment_tree = NULL; \
gdk_return res = GDK_SUCCEED; \
\
@@ -3600,7 +3600,7 @@ GDKanalytical_##NAME(BAT *r, BAT *p, BAT
*levels_offset = NULL, tree_capacity = 0, nlevels = 0; \
lng n = 0; \
bit *np = pi.base, *op = oi.base; \
- dbl *restrict rb = (dbl *) Tloc(r, 0), mean1 = 0, mean2 = 0, m2 = 0,
delta1, delta2; \
+ dbl *rb = (dbl *) Tloc(r, 0), mean1 = 0, mean2 = 0, m2 = 0, delta1,
delta2; \
void *segment_tree = NULL; \
gdk_return res = GDK_SUCCEED; \
\
@@ -3852,7 +3852,7 @@ GDKanalytical_correlation(BAT *r, BAT *p
const oid *restrict start = si.base, *restrict end = ei.base;
lng n = 0;
const bit *np = pi.base, *op = oi.base;
- dbl *restrict rb = (dbl *) Tloc(r, 0), mean1 = 0, mean2 = 0, up = 0,
down1 = 0, down2 = 0, delta1, delta2, aux, rr;
+ dbl *rb = (dbl *) Tloc(r, 0), mean1 = 0, mean2 = 0, up = 0, down1 = 0,
down2 = 0, delta1, delta2, aux, rr;
void *segment_tree = NULL;
gdk_return res = GDK_SUCCEED;
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -632,11 +632,12 @@ BATclear(BAT *b, bool force)
b->tvheap->dirty = true;
}
}
- MT_lock_unset(&b->theaplock);
if (force)
b->batInserted = 0;
- BATsetcount(b,0);
+ b->batCount = 0;
+ if (b->ttype == TYPE_void)
+ b->batCapacity = 0;
BAThseqbase(b, 0);
BATtseqbase(b, ATOMtype(b->ttype) == TYPE_oid ? 0 : oid_nil);
b->batDirtydesc = true;
@@ -644,6 +645,7 @@ BATclear(BAT *b, bool force)
BATsettrivprop(b);
b->tnosorted = b->tnorevsorted = 0;
b->tnokey[0] = b->tnokey[1] = 0;
+ MT_lock_unset(&b->theaplock);
return GDK_SUCCEED;
}
@@ -1162,22 +1164,42 @@ BUNappendmulti(BAT *b, const void *value
}
MT_rwlock_wrlock(&b->thashlock);
if (values && b->ttype) {
- for (BUN i = 0; i < count; i++) {
- t = b->tvarsized ? ((void **) values)[i] :
- (void *) ((char *) values + (i << b->tshift));
- gdk_return rc = bunfastapp_nocheck(b, t);
- if (rc != GDK_SUCCEED) {
- MT_rwlock_wrunlock(&b->thashlock);
- return rc;
+ if (b->tvarsized) {
+ for (BUN i = 0; i < count; i++) {
+ t = ((void **) values)[i];
+ gdk_return rc = tfastins_nocheckVAR(b, p, t);
+ if (rc != GDK_SUCCEED) {
+ MT_rwlock_wrunlock(&b->thashlock);
+ return rc;
+ }
+ if (b->thash) {
+ HASHappend_locked(b, p, t);
+ }
+ p++;
}
- if (b->thash) {
- HASHappend_locked(b, p, t);
+ } else if (ATOMstorage(b->ttype) == TYPE_msk) {
+ for (BUN i = 0; i < count; i++) {
+ t = (void *) ((char *) values + (i <<
b->tshift));
+ mskSetVal(b, p, *(msk *) t);
+ p++;
}
- p++;
+ } else {
+ for (BUN i = 0; i < count; i++) {
+ t = (void *) ((char *) values + (i <<
b->tshift));
+ gdk_return rc = tfastins_nocheckFIX(b, p, t);
+ if (rc != GDK_SUCCEED) {
+ MT_rwlock_wrunlock(&b->thashlock);
+ return rc;
+ }
+ if (b->thash) {
+ HASHappend_locked(b, p, t);
+ }
+ p++;
+ }
}
} else {
for (BUN i = 0; i < count; i++) {
- gdk_return rc = bunfastapp_nocheck(b, t);
+ gdk_return rc = tfastins_nocheck(b, p, t);
if (rc != GDK_SUCCEED) {
MT_rwlock_wrunlock(&b->thashlock);
return rc;
@@ -1189,6 +1211,7 @@ BUNappendmulti(BAT *b, const void *value
}
}
MT_rwlock_wrunlock(&b->thashlock);
+ BATsetcount(b, p);
IMPSdestroy(b); /* no support for inserts in imprints yet */
OIDXdestroy(b);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -226,7 +226,6 @@ insert_string_bat(BAT *b, BAT *n, struct
/* we don't need to do any translation of offset
* values, so we can use fast memcpy */
memcpy(Tloc(b, BUNlast(b)), (const char *) ni.base + ((ci->seq
- n->hseqbase) << ni.shift), cnt << ni.shift);
- BATsetcount(b, oldcnt + cnt);
} else if (toff != ~(size_t) 0) {
/* we don't need to insert any actual strings since we
* have already made sure that they are all in b's
@@ -311,7 +310,6 @@ insert_string_bat(BAT *b, BAT *n, struct
break;
}
}
- BATsetcount(b, r); /* set batCount and theap->free */
} else if (b->tvheap->free < ni.vh->free / 2 ||
GDK_ELIMDOUBLES(b->tvheap)) {
/* if b's string heap is much smaller than n's string
@@ -332,7 +330,6 @@ insert_string_bat(BAT *b, BAT *n, struct
}
r++;
}
- BATsetcount(b, r);
} else {
/* Insert values from n individually into b; however,
* we check whether there is a string in b's string
@@ -382,8 +379,8 @@ insert_string_bat(BAT *b, BAT *n, struct
}
r++;
}
- BATsetcount(b, r);
}
+ BATsetcount(b, oldcnt + ci->ncand);
bat_iterator_end(&ni);
assert(b->batCapacity >= b->batCount);
b->theap->dirty = true;
@@ -460,11 +457,13 @@ append_varsized_bat(BAT *b, BAT *n, stru
b->theap->dirty = true;
BATsetcount(b, BATcount(b) + ci->ncand);
/* maintain hash table */
+ MT_rwlock_wrlock(&b->thashlock);
for (BUN i = BATcount(b) - ci->ncand;
b->thash && i < BATcount(b);
i++) {
- HASHappend(b, i, b->tvheap->base + *(var_t *) Tloc(b,
i));
+ HASHappend_locked(b, i, b->tvheap->base + *(var_t *)
Tloc(b, i));
}
+ MT_rwlock_wrunlock(&b->thashlock);
bat_iterator_end(&ni);
return GDK_SUCCEED;
}
@@ -499,7 +498,7 @@ append_varsized_bat(BAT *b, BAT *n, stru
cnt--;
BUN p = canditer_next(ci) - hseq;
const void *t = BUNtvar(ni, p);
- if (bunfastapp_nocheckVAR(b, t) != GDK_SUCCEED) {
+ if (tfastins_nocheckVAR(b, r, t) != GDK_SUCCEED) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list