Changeset: 451b7f4272a1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=451b7f4272a1
Modified Files:
        gdk/gdk_heap.c
Branch: default
Log Message:

Merge with Feb2013 branch.


diffs (102 lines):

diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -93,7 +93,7 @@ HEAPcacheInit(void)
 #endif
        MT_lock_set(&HEAPcacheLock, "HEAPcache_init");
        hc.used = 0;
-       hc.hc = GDKmalloc(sizeof(heap_cache_e) * hc.sz);
+       hc.hc = GDKmalloc(sizeof(heap_cache_e) * HEAP_CACHE_SIZE);
        if (hc.hc == NULL) {
                MT_lock_unset(&HEAPcacheLock, "HEAPcache_init");
                return;
@@ -411,7 +411,7 @@ HEAPextend(Heap *h, size_t size)
                if (!must_mmap) {
                        void *p = h->base;
                        h->newstorage = h->storage = STORE_MEM;
-                       h->base = (char *) GDKreallocmax(h->base, size, 
&h->maxsize, 0);
+                       h->base = GDKreallocmax(h->base, size, &h->maxsize, 0);
                        HEAPDEBUG fprintf(stderr, "#HEAPextend: extending 
malloced heap " SZFMT " " SZFMT " " PTRFMT " " PTRFMT "\n", size, h->maxsize, 
PTRFMTCAST p, PTRFMTCAST h->base);
                        if (h->base)
                                return 0;
@@ -419,9 +419,10 @@ HEAPextend(Heap *h, size_t size)
                /* too big: convert it to a disk-based temporary heap */
                if (can_mmap) {
                        int fd;
-                       char *of = h->filename;
                        int existing = 0;
 
+                       assert(h->storage == STORE_MEM);
+                       h->filename = NULL;
                        /* if the heap file already exists, we want to
                         * switch to STORE_PRIV (copy-on-write memory
                         * mapped files), but if the heap file doesn't
@@ -431,19 +432,32 @@ HEAPextend(Heap *h, size_t size)
                        if (fd >= 0) {
                                existing = 1;
                                close(fd);
+                       } else {
+                               /* no pre-existing heap file, attempt
+                                * to use a file from the cache (or
+                                * create a new one) */
+                               h->filename = GDKmalloc(strlen(nme) + 
strlen(ext) + 2);
+                               if (h->filename == NULL)
+                                       goto failed;
+                               sprintf(h->filename, "%s.%s", nme, ext);
+                               h->base = HEAPcacheFind(&h->maxsize, 
h->filename, STORE_MMAP);
+                               if (h->base) {
+                                       h->newstorage = h->storage = STORE_MMAP;
+                                       memcpy(h->base, bak.base, bak.free);
+                                       HEAPfree(&bak);
+                                       return 0;
+                               }
                        }
-                       h->filename = NULL;
                        fd = GDKfdlocate(nme, "wb", ext);
                        if (fd >= 0) {
                                close(fd);
-                               if (h->storage == STORE_MEM) {
-                                       storage_t newmode = h->newstorage == 
STORE_MMAP && existing && !h->forcemap ? STORE_PRIV : h->newstorage;
-                                       /* make sure we really MMAP */
-                                       if (must_mmap && h->newstorage == 
STORE_MEM)
-                                               newmode = STORE_MMAP;
-                                       h->newstorage = h->storage = newmode;
-                                       h->forcemap = 0;
-                               }
+                               h->storage = h->newstorage == STORE_MMAP && 
existing && !h->forcemap ? STORE_PRIV : h->newstorage;
+                               /* make sure we really MMAP */
+                               if (must_mmap && h->newstorage == STORE_MEM)
+                                       h->storage = STORE_MMAP;
+                               h->newstorage = h->storage;
+                               h->forcemap = 0;
+
                                h->base = NULL;
                                HEAPDEBUG fprintf(stderr, "#HEAPextend: 
converting malloced to %s mmapped heap\n", h->newstorage == STORE_MMAP ? 
"shared" : "privately");
                                /* try to allocate a memory-mapped
@@ -457,13 +471,10 @@ HEAPextend(Heap *h, size_t size)
                                }
                                /* couldn't allocate, now first save
                                 * data to file */
-                               if (HEAPsave_intern(&bak, nme, ext, ".tmp") < 
0) {
-                                       *h = bak;
-                                       return -1;
-                               }
+                               if (HEAPsave_intern(&bak, nme, ext, ".tmp") < 0)
+                                       goto failed;
                                /* then free memory */
                                HEAPfree(&bak);
-                               of = NULL;      /* file name is freed by 
HEAPfree */
                                /* and load heap back in via
                                 * memory-mapped file */
                                if (HEAPload_intern(h, nme, ext, ".tmp", FALSE) 
>= 0) {
@@ -473,9 +484,8 @@ HEAPextend(Heap *h, size_t size)
                                }
                                /* we failed */
                        }
-                       if (of)
-                               GDKfree(of);
                }
+         failed:
                *h = bak;
        }
        GDKerror("HEAPextend: failed to extend to " SZFMT " for %s%s%s\n",
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to