Changeset: 25367d1b0e7f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/25367d1b0e7f
Modified Files:
gdk/gdk_align.c
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_private.h
Branch: default
Log Message:
Specify materialized capacity in argument.
This way, batCapacity is only changed after the capacity was created.
diffs (157 lines):
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -169,9 +169,8 @@ VIEWcreate(oid seq, BAT *b)
*/
gdk_return
-BATmaterialize(BAT *b)
+BATmaterialize(BAT *b, BUN cap)
{
- BUN cnt;
Heap *tail;
Heap *h, *vh = NULL;
BUN p, q;
@@ -179,17 +178,19 @@ BATmaterialize(BAT *b)
BATcheck(b, GDK_FAIL);
assert(!isVIEW(b));
+ if (cap == BUN_NONE)
+ cap = BATcapacity(b);
+ assert(cap >= BATcapacity(b));
if (b->ttype != TYPE_void) {
- /* no voids */
- return GDK_SUCCEED;
+ /* no voids; just call BATextend to make sure of capacity */
+ return BATextend(b, cap);
}
- cnt = BATcapacity(b);
if ((tail = GDKmalloc(sizeof(Heap))) == NULL)
return GDK_FAIL;
p = 0;
q = BATcount(b);
- assert(cnt >= q - p);
+ assert(cap >= q - p);
TRC_DEBUG(ALGO, "BATmaterialize(" ALGOBATFMT ")\n", ALGOBATPAR(b));
/* cleanup possible ACC's */
@@ -203,7 +204,7 @@ BATmaterialize(BAT *b)
.dirty = true,
};
settailname(tail, BBP_physical(b->batCacheid), TYPE_oid, 0);
- if (HEAPalloc(tail, cnt, sizeof(oid), 0) != GDK_SUCCEED) {
+ if (HEAPalloc(tail, cap, sizeof(oid), 0) != GDK_SUCCEED) {
GDKfree(tail);
return GDK_FAIL;
}
@@ -266,6 +267,7 @@ BATmaterialize(BAT *b)
BATsetdims(b, 0);
b->batDirtydesc = true;
BATsetcount(b, b->batCount);
+ BATsetcapacity(b, cap);
MT_lock_unset(&b->theaplock);
HEAPdecref(h, false);
if (vh)
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1046,8 +1046,7 @@ BUNappendmulti(BAT *b, const void *value
return GDK_SUCCEED;
} else {
/* we need to materialize b; allocate enough capacity */
- b->batCapacity = BATcount(b) + count;
- if (BATmaterialize(b) != GDK_SUCCEED)
+ if (BATmaterialize(b, BATcount(b) + count) !=
GDK_SUCCEED)
return GDK_FAIL;
}
}
@@ -1336,7 +1335,7 @@ BUNdelete(BAT *b, oid o)
/* replace to-be-delete BUN with last BUN; materialize
* void column before doing so */
if (b->ttype == TYPE_void &&
- BATmaterialize(b) != GDK_SUCCEED)
+ BATmaterialize(b, BUN_NONE) != GDK_SUCCEED)
return GDK_FAIL;
if (ATOMstorage(b->ttype) == TYPE_msk) {
msk mval = mskGetVal(b, BATcount(b) - 1);
@@ -1685,7 +1684,7 @@ BUNreplacemulti(BAT *b, const oid *posit
{
BATcheck(b, GDK_FAIL);
- if (b->ttype == TYPE_void && BATmaterialize(b) != GDK_SUCCEED)
+ if (b->ttype == TYPE_void && BATmaterialize(b, BUN_NONE) != GDK_SUCCEED)
return GDK_FAIL;
return BUNinplacemulti(b, positions, values, count, force, false);
@@ -1698,7 +1697,7 @@ BUNreplacemultiincr(BAT *b, oid position
{
BATcheck(b, GDK_FAIL);
- if (b->ttype == TYPE_void && BATmaterialize(b) != GDK_SUCCEED)
+ if (b->ttype == TYPE_void && BATmaterialize(b, BUN_NONE) != GDK_SUCCEED)
return GDK_FAIL;
return BUNinplacemulti(b, &position, values, count, force, true);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -756,9 +756,8 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool
goto doreturn;
}
/* we need to materialize b; allocate enough capacity */
- b->batCapacity = BATcount(b) + ci.ncand;
MT_lock_unset(&b->theaplock);
- if (BATmaterialize(b) != GDK_SUCCEED) {
+ if (BATmaterialize(b, BATcount(b) + ci.ncand) != GDK_SUCCEED) {
bat_iterator_end(&ni);
return GDK_FAIL;
}
@@ -948,7 +947,7 @@ BATdel(BAT *b, BAT *d)
p++;
}
}
- if (BATtdense(b) && BATmaterialize(b) != GDK_SUCCEED)
+ if (BATtdense(b) && BATmaterialize(b, BUN_NONE) != GDK_SUCCEED)
return GDK_FAIL;
MT_lock_set(&b->theaplock);
if (o + c < b->hseqbase + BATcount(b)) {
@@ -991,7 +990,7 @@ BATdel(BAT *b, BAT *d)
GDKerror("cannot delete committed values\n");
return GDK_FAIL;
}
- if (BATtdense(b) && BATmaterialize(b) != GDK_SUCCEED) {
+ if (BATtdense(b) && BATmaterialize(b, BUN_NONE) != GDK_SUCCEED)
{
bat_iterator_end(&di);
return GDK_FAIL;
}
@@ -2512,7 +2511,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
assert(g->ttype == TYPE_oid);
grps = (oid *) Tloc(g, 0);
prev = grps[0];
- if (BATmaterialize(bn) != GDK_SUCCEED)
+ if (BATmaterialize(bn, BUN_NONE) != GDK_SUCCEED)
goto error;
for (r = 0, p = 1, q = BATcount(g); p < q; p++) {
if (grps[p] != prev) {
@@ -2559,7 +2558,7 @@ BATsort(BAT **sorted, BAT **order, BAT *
}
if ((reverse != nilslast ||
(reverse ? !bn->trevsorted : !bn->tsorted)) &&
- (BATmaterialize(bn) != GDK_SUCCEED ||
+ (BATmaterialize(bn, BUN_NONE) != GDK_SUCCEED ||
do_sort(Tloc(bn, 0),
ords,
bn->tvheap ? bn->tvheap->base : NULL,
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -78,7 +78,7 @@ bool BATiscand(BAT *b)
__attribute__((__visibility__("hidden")));
BAT *BATload_intern(bat bid, bool lock)
__attribute__((__visibility__("hidden")));
-gdk_return BATmaterialize(BAT *b)
+gdk_return BATmaterialize(BAT *b, BUN cap)
__attribute__((__warn_unused_result__))
__attribute__((__visibility__("hidden")));
void BATrmprop(BAT *b, enum prop_t idx)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]