Changeset: 37cb815a9757 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=37cb815a9757
Modified Files:
gdk/gdk_heap.c
gdk/gdk_posix.c
Branch: default
Log Message:
merge with default
diffs (212 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->size = size;
h->base = p;
return 0;
+ } else {
+ failure = "MT_mremap() failed";
}
} else {
/* extend a malloced heap, possibly switching over to
@@ -394,6 +399,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) {
@@ -416,8 +423,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) {
@@ -425,6 +434,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);
@@ -447,11 +458,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
@@ -460,15 +475,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;
}
diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -412,8 +412,10 @@ MT_mremap(const char *path, int mode, vo
if (*new_size < old_size) {
/* shrink */
if (munmap((char *) old_address + *new_size,
- old_size - *new_size) < 0)
+ old_size - *new_size) < 0) {
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): munmap() failed\n", __FILE__, __LINE__,
path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return NULL;
+ }
if (truncate(path, (off_t) *new_size) < 0)
fprintf(stderr, "#MT_mremap(%s): truncate failed\n",
path);
#ifdef MMAP_DEBUG
@@ -432,10 +434,36 @@ MT_mremap(const char *path, int mode, vo
if (!(mode & MMAP_COPY) && path != NULL) {
/* "normal" memory map */
- if ((fd = open(path, O_RDWR)) < 0)
+ if ((fd = open(path, O_RDWR)) < 0) {
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): open() failed\n", __FILE__, __LINE__,
path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return NULL;
+<<<<<<< variant A
if (GDKextendf(fd, *new_size) < 0) {
+>>>>>>> variant B
+ }
+ if (fstat(fd, &stb) < 0) {
+ /* shouldn't happen */
close(fd);
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): fstat() failed\n", __FILE__, __LINE__,
path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
+ return NULL;
+ }
+ /* if necessary, extend the underlying file */
+ if (stb.st_size < (off_t) *new_size &&
+ (lseek(fd, *new_size - 1, SEEK_SET) < 0 ||
+ write(fd, "\0", 1) < 0)) {
+####### Ancestor
+ if (fstat(fd, &stb) < 0) {
+ /* shouldn't happen */
+ close(fd);
+ return NULL;
+ }
+ /* if necessary, extend the underlying file */
+ if (stb.st_size < (off_t) *new_size &&
+ (lseek(fd, *new_size - 1, SEEK_SET) < 0 ||
+ write(fd, "\0", 1) < 0)) {
+======= end
+ close(fd);
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): lseek() or write() failed\n", __FILE__,
__LINE__, path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return NULL;
}
#ifdef HAVE_MREMAP
@@ -474,8 +502,10 @@ MT_mremap(const char *path, int mode, vo
#ifdef MAP_ANONYMOUS
flags |= MAP_ANONYMOUS;
#else
- if ((fd = open("/dev/zero", O_RDWR)) < 0)
+ if ((fd = open("/dev/zero", O_RDWR)) < 0) {
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): open('/dev/zero') failed\n", __FILE__,
__LINE__, path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return NULL;
+ }
#endif
/* try to map an anonymous area as extent to the
* current map */
@@ -539,12 +569,15 @@ MT_mremap(const char *path, int mode, vo
fd = open(p, O_RDWR | O_CREAT,
MONETDB_MODE);
free(p);
- if (fd < 0)
+ if (fd < 0) {
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): fd < 0\n", __FILE__, __LINE__,
path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return NULL;
+ }
if (write(fd, old_address,
old_size) < 0 ||
ftruncate(fd, *new_size) < 0) {
close(fd);
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): write() or lseek() or write()
failed\n", __FILE__, __LINE__, path?path:"NULL", PTRFMTCAST old_address,
old_size, *new_size);
return NULL;
}
p = mmap(NULL, *new_size, prot, flags,
@@ -561,6 +594,8 @@ MT_mremap(const char *path, int mode, vo
#ifdef MMAP_DEBUG
fprintf(stderr, "MT_mremap(%s,"PTRFMT","SZFMT","SZFMT") ->
"PTRFMT"%s\n", path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size,
PTRFMTCAST p, path && mode & MMAP_COPY ? " private" : "");
#endif
+ if (p == MAP_FAILED)
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): p == MAP_FAILED\n", __FILE__, __LINE__,
path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return p == MAP_FAILED ? NULL : p;
}
@@ -769,8 +804,10 @@ MT_mremap(const char *path, int mode, vo
*new_size = old_size;
return old_address; /* don't bother shrinking */
}
- if (GDKextend(path, *new_size) < 0)
+ if (GDKextend(path, *new_size) < 0) {
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): GDKextend() failed\n", __FILE__,
__LINE__, path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return NULL;
+ }
if (path && !(mode & MMAP_COPY))
MT_munmap(old_address, old_size);
p = MT_mmap(path, mode, *new_size);
@@ -781,6 +818,8 @@ MT_mremap(const char *path, int mode, vo
#ifdef MMAP_DEBUG
fprintf(stderr, "MT_mremap(%s,"PTRFMT","SZFMT","SZFMT") -> "PTRFMT"\n",
path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size, PTRFMTCAST p);
#endif
+ if (p == NULL)
+ fprintf(stderr, "= %s:%d:
MT_mremap(%s,"PTRFMT","SZFMT","SZFMT"): p == NULL\n", __FILE__, __LINE__,
path?path:"NULL", PTRFMTCAST old_address, old_size, *new_size);
return p;
}
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list