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

Reply via email to