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

HEAPextend(): provide some more (debigging-) information in case of failure


diffs (100 lines):

diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -344,6 +344,7 @@ int
 HEAPextend(Heap *h, size_t size)
 {
        char nme[PATHLENGTH], *ext = NULL;
+       char *failure = "None";
 
        if (h->filename) {
                strncpy(nme, h->filename, sizeof(nme));
@@ -352,6 +353,8 @@ HEAPextend(Heap *h, size_t size)
        }
        if (size <= h->size)
                return 0;
+       else
+               failure = "size > h->size";
 
        if (h->storage != STORE_MEM) {
                char *p;
@@ -370,6 +373,8 @@ HEAPextend(Heap *h, size_t size)
                        h->maxsize = h->size = size;
                        h->base = p;
                        return 0;
+               } else {
+                       failure = "MT_mremap() failed";
                }
        } else {
                /* extend a malloced heap, possibly switching over to
@@ -395,6 +400,8 @@ HEAPextend(Heap *h, size_t size)
                        HEAPDEBUG fprintf(stderr, "#HEAPextend: extending 
malloced heap " SZFMT " " SZFMT " " PTRFMT " " PTRFMT "\n", size, h->size, 
PTRFMTCAST p, PTRFMTCAST h->base);
                        if (h->base)
                                return 0;
+                       else
+                               failure = "h->storage == STORE_MEM && !must_map 
&& !h->base";
                }
                /* too big: convert it to a disk-based temporary heap */
                if (can_mmap) {
@@ -417,8 +424,10 @@ HEAPextend(Heap *h, size_t size)
                                 * to use a file from the cache (or
                                 * create a new one) */
                                h->filename = GDKmalloc(strlen(nme) + 
strlen(ext) + 2);
-                               if (h->filename == NULL)
+                               if (h->filename == NULL) {
+                                       failure = "h->storage == STORE_MEM && 
can_map && h->filename == NULL";
                                        goto failed;
+                               }
                                sprintf(h->filename, "%s.%s", nme, ext);
                                h->base = HEAPcacheFind(&h->size, h->filename, 
STORE_MMAP);
                                if (h->base) {
@@ -427,6 +436,8 @@ HEAPextend(Heap *h, size_t size)
                                        memcpy(h->base, bak.base, bak.free);
                                        HEAPfree(&bak);
                                        return 0;
+                               } else {
+                                       failure = "h->storage == STORE_MEM && 
can_map && !h->base";
                                }
                        }
                        fd = GDKfdlocate(nme, "wb", ext);
@@ -449,11 +460,15 @@ HEAPextend(Heap *h, size_t size)
                                        memcpy(h->base, bak.base, bak.free);
                                        HEAPfree(&bak);
                                        return 0;
+                               } else {
+                                       failure = "h->storage == STORE_MEM && 
can_map && fd >= 0 && HEAPload() < 0";
                                }
                                /* couldn't allocate, now first save
                                 * data to file */
-                               if (HEAPsave_intern(&bak, nme, ext, ".tmp") < 0)
+                               if (HEAPsave_intern(&bak, nme, ext, ".tmp") < 
0) {
+                                       failure = "h->storage == STORE_MEM && 
can_map && fd >= 0 && HEAPsave_intern() < 0";
                                        goto failed;
+                               }
                                /* then free memory */
                                HEAPfree(&bak);
                                /* and load heap back in via
@@ -462,15 +477,21 @@ HEAPextend(Heap *h, size_t size)
                                        /* success! */
                                        GDKclrerr();    /* don't leak errors 
from e.g. HEAPload */
                                        return 0;
+                               } else {
+                                       failure = "h->storage == STORE_MEM && 
can_map && fd >= 0 && HEAPload_intern() < 0";
                                }
                                /* we failed */
+                       } else {
+                               failure = "h->storage == STORE_MEM && can_map 
&& fd < 0";
                        }
+               } else {
+                       failure = "h->storage == STORE_MEM && !can_map";
                }
          failed:
                *h = bak;
        }
-       GDKerror("HEAPextend: failed to extend to " SZFMT " for %s%s%s\n",
-                size, nme, ext ? "." : "", ext ? ext : "");
+       GDKerror("HEAPextend: failed to extend to " SZFMT " for %s%s%s: %s\n",
+                size, nme, ext ? "." : "", ext ? ext : "", failure);
        return -1;
 }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to