Changeset: 49f602f33158 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/49f602f33158
Modified Files:
        gdk/gdk_string.c
Branch: Jul2021
Log Message:

Delay initialization of string heap hash until first string is entered.
This means that empty string bats take up no space at all.


diffs (70 lines):

diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -71,16 +71,8 @@ strHeap(Heap *d, size_t cap)
 
        cap = MAX(cap, BATTINY);
        size = GDK_STRHASHTABLE * sizeof(stridx_t) + MIN(GDK_ELIMLIMIT, cap * 
GDK_VARALIGN);
-       if (HEAPalloc(d, size, 1, 1) == GDK_SUCCEED) {
-               d->free = GDK_STRHASHTABLE * sizeof(stridx_t);
-               d->dirty = true;
-               memset(d->base, 0, d->free);
-               d->hashash = false;
-#ifndef NDEBUG
-               /* fill should solve initialization problems within valgrind */
-               memset(d->base + d->free, 0, d->size - d->free);
-#endif
-       }
+       if (HEAPalloc(d, size, 1, 1) != GDK_SUCCEED)
+               GDKerror("alloc failed");
 }
 
 
@@ -164,6 +156,11 @@ strLocate(Heap *h, const char *v)
 
        /* search hash-table, if double-elimination is still in place */
        BUN off;
+       if (h->free == 0) {
+               /* empty, so there are no strings */
+               return 0;
+       }
+
        off = strHash(v);
        off &= GDK_STRHASHMASK;
 
@@ -264,6 +261,35 @@ strPut(BAT *b, var_t *dst, const void *V
        stridx_t *bucket;
        BUN off, strhash;
 
+       if (h->free == 0) {
+               if (h->size < 64 * 1024) {
+                       MT_lock_set(&b->theaplock);
+                       if (ATOMIC_GET(&h->refs) == 1) {
+                               if (HEAPextend(h, 64 * 1024, true) != 
GDK_SUCCEED) {
+                                       MT_lock_unset(&b->theaplock);
+                                       return 0;
+                               }
+                       } else {
+                               MT_lock_unset(&b->theaplock);
+                               Heap *new = HEAPgrow(h, 64 * 1024);
+                               if (new == NULL)
+                                       return 0;
+                               MT_lock_set(&b->theaplock);
+                               HEAPdecref(h, false);
+                               b->tvheap = h = new;
+                       }
+                       MT_lock_unset(&b->theaplock);
+               }
+               h->free = GDK_STRHASHTABLE * sizeof(stridx_t);
+               h->dirty = true;
+               memset(h->base, 0, h->free);
+               h->hashash = false;
+#ifndef NDEBUG
+               /* fill should solve initialization problems within valgrind */
+               memset(h->base + h->free, 0, h->size - h->free);
+#endif
+       }
+
        off = strHash(v);
        strhash = off;
        off &= GDK_STRHASHMASK;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to