Changeset: 981dd1f0e133 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/981dd1f0e133
Modified Files:
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_heap.c
gdk/gdk_private.h
gdk/gdk_project.c
Branch: Jul2021
Log Message:
Take view offset into account when copying heaps.
diffs (96 lines):
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -809,12 +809,12 @@ COLcopy(BAT *b, int tt, bool writable, r
/* first try case (1); create a view, possibly with different
* atom-types */
- if (role == b->batRole &&
+ if (!writable &&
+ role == b->batRole &&
b->batRestricted == BAT_READ &&
ATOMstorage(b->ttype) != TYPE_msk && /* no view on TYPE_msk */
(!VIEWtparent(b) ||
- BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ) &&
- !writable) {
+ BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ)) {
bn = VIEWcreate(b->hseqbase, b);
if (bn == NULL)
return NULL;
@@ -875,8 +875,8 @@ COLcopy(BAT *b, int tt, bool writable, r
strconcat_len(thp.filename, sizeof(thp.filename),
BBP_physical(bn->batCacheid),
".theap", NULL);
- if ((b->ttype && HEAPcopy(&bthp, b->theap) !=
GDK_SUCCEED) ||
- (bn->tvheap && HEAPcopy(&thp, b->tvheap) !=
GDK_SUCCEED)) {
+ if ((b->ttype && HEAPcopy(&bthp, b->theap, b->tbaseoff
<< b->tshift) != GDK_SUCCEED) ||
+ (bn->tvheap && HEAPcopy(&thp, b->tvheap, 0) !=
GDK_SUCCEED)) {
HEAPfree(&thp, true);
HEAPfree(&bthp, true);
BBPreclaim(bn);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -32,7 +32,7 @@ unshare_varsized_heap(BAT *b)
h->farmid = BBPselectfarm(b->batRole, TYPE_str, varheap);
strconcat_len(h->filename, sizeof(h->filename),
BBP_physical(b->batCacheid), ".theap", NULL);
- if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+ if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
@@ -496,7 +496,7 @@ append_varsized_bat(BAT *b, BAT *n, stru
h->farmid = BBPselectfarm(b->batRole, b->ttype, varheap);
strconcat_len(h->filename, sizeof(h->filename),
BBP_physical(b->batCacheid), ".theap", NULL);
- if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+ if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -651,11 +651,13 @@ GDKupgradevarheap(BAT *b, var_t v, BUN c
* dst->filename (or NULL), which might be used in HEAPalloc().
*/
gdk_return
-HEAPcopy(Heap *dst, Heap *src)
+HEAPcopy(Heap *dst, Heap *src, size_t offset)
{
- if (HEAPalloc(dst, src->size, 1, 1) == GDK_SUCCEED) {
- dst->free = src->free;
- memcpy(dst->base, src->base, src->free);
+ if (offset > src->free)
+ offset = src->free;
+ if (HEAPalloc(dst, src->free - offset, 1, 1) == GDK_SUCCEED) {
+ dst->free = src->free - offset;
+ memcpy(dst->base, src->base + offset, src->free - offset);
dst->hashash = src->hashash;
dst->cleanhash = src->cleanhash;
dst->dirty = true;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -184,7 +184,7 @@ gdk_return HASHnew(Hash *h, int tpe, BUN
gdk_return HEAPalloc(Heap *h, size_t nitems, size_t itemsize, size_t
itemsizemmap)
__attribute__((__warn_unused_result__))
__attribute__((__visibility__("hidden")));
-gdk_return HEAPcopy(Heap *dst, Heap *src)
+gdk_return HEAPcopy(Heap *dst, Heap *src, size_t offset)
__attribute__((__warn_unused_result__))
__attribute__((__visibility__("hidden")));
gdk_return HEAPdelete(Heap *h, const char *o, const char *ext)
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -747,7 +747,7 @@ BATproject2(BAT *restrict l, BAT *restri
sizeof(bn->tvheap->filename),
BBP_physical(bn->batCacheid), ".theap",
NULL);
- if (HEAPcopy(bn->tvheap, r1->tvheap) != GDK_SUCCEED)
+ if (HEAPcopy(bn->tvheap, r1->tvheap, 0) != GDK_SUCCEED)
goto bailout;
}
bn->ttype = r1->ttype;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list