Changeset: 48db4970b7e1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=48db4970b7e1
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_private.h
Branch: default
Log Message:

Merge with Oct2014 branch.


diffs (109 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1214,6 +1214,11 @@ BUNins(BAT *b, const void *h, const void
                        return NULL;
                }
 
+               if (unshare_string_heap(b) == GDK_FAIL) {
+                       GDKerror("BUNins: failed to unshare string heap\n");
+                       return NULL;
+               }
+
                ALIGNins(b, "BUNins", force);
                b->batDirty = 1;
                if (b->H->hash && b->H->vheap)
@@ -1320,6 +1325,11 @@ BUNappend(BAT *b, const void *t, bit for
        }
        void_materialize(b, t);
 
+       if (unshare_string_heap(b) == GDK_FAIL) {
+               GDKerror("BUNappend: failed to unshare string heap\n");
+               return NULL;
+       }
+
        setcolprops(b, b->H, h);
        setcolprops(b, b->T, t);
 
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -41,6 +41,35 @@
                }                                                       \
        } while (0)
 
+gdk_return
+unshare_string_heap(BAT *b)
+{
+       if (b->ttype == TYPE_str &&
+           b->T->vheap->parentid != abs(b->batCacheid)) {
+               Heap *h = GDKzalloc(sizeof(Heap));
+               if (h == NULL)
+                       return GDK_FAIL;
+               h->parentid = abs(b->batCacheid);
+               h->farmid = BBPselectfarm(b->batRole, TYPE_str, varheap);
+               if (b->T->vheap->filename) {
+                       char *nme = BBP_physical(b->batCacheid);
+                       h->filename = GDKfilepath(NOFARM, NULL, nme, "theap");
+                       if (h->filename == NULL) {
+                               GDKfree(h);
+                               return GDK_FAIL;
+                       }
+               }
+               if (HEAPcopy(h, b->T->vheap) < 0) {
+                       HEAPfree(h, 1);
+                       GDKfree(h);
+                       return GDK_FAIL;
+               }
+               BBPunshare(b->T->vheap->parentid);
+               b->T->vheap = h;
+       }
+       return GDK_SUCCEED;
+}
+
 /* We try to be clever when appending one string bat to another.
  * First of all, we try to actually share the string heap so that we
  * don't need an extra copy, and if that can't be done, we see whether
@@ -108,27 +137,9 @@ insert_string_bat(BAT *b, BAT *n, int ap
                                toff = 0;
                        } else if (b->T->vheap->parentid == 
n->T->vheap->parentid) {
                                toff = 0;
-                       } else if (b->T->vheap->parentid != bid) {
-                               Heap *h = GDKzalloc(sizeof(Heap));
-                               if (h == NULL)
-                                       return NULL;
-                               h->parentid = bid;
-                               h->farmid = BBPselectfarm(b->batRole, TYPE_str, 
varheap);
-                               if (b->T->vheap->filename) {
-                                       char *nme = BBP_physical(b->batCacheid);
-                                       h->filename = GDKfilepath(NOFARM, NULL, 
nme, "theap");
-                                       if (h->filename == NULL) {
-                                               GDKfree(h);
-                                               return NULL;
-                                       }
-                               }
-                               if (HEAPcopy(h, b->T->vheap) < 0) {
-                                       HEAPfree(h, 1);
-                                       GDKfree(h);
-                                       return NULL;
-                               }
-                               BBPunshare(b->T->vheap->parentid);
-                               b->T->vheap = h;
+                       } else if (b->T->vheap->parentid != bid &&
+                                  unshare_string_heap(b) == GDK_FAIL) {
+                               return NULL;
                        }
                }
                if (toff == ~(size_t) 0 && n->batCount > 1024) {
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -170,6 +170,8 @@ int IMPSgetbin(int tpe, bte bits, const 
 void IMPSprint(BAT *b)
        __attribute__((__visibility__("hidden")));
 #endif
+gdk_return unshare_string_heap(BAT *b)
+       __attribute__((__visibility__("hidden")));
 oid MAXoid(BAT *i)
        __attribute__((__visibility__("hidden")));
 void MT_global_exit(int status)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to