Changeset: 80514d736867 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=80514d736867 Modified Files: gdk/gdk.h gdk/gdk_atoms.c gdk/gdk_bat.c gdk/gdk_heap.c gdk/gdk_posix.c gdk/gdk_storage.c gdk/gdk_utils.c testing/Mtest.py.in Branch: default Log Message:
Merge with Feb2013 branch. diffs (truncated from 371 to 300 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -637,7 +637,7 @@ typedef enum { } storage_t; typedef struct { - size_t maxsize; /* maximum realloc size (bytes) */ + size_t maxsize; /* deprecated: kept equal to size */ size_t free; /* index where free area starts. */ size_t size; /* size of the heap (bytes) */ char *base; /* base pointer in memory. */ diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -1182,11 +1182,6 @@ strPut(Heap *h, var_t *dst, const char * GDKerror("strPut: string heaps gets larger than " SZFMT "GB.\n", (((size_t) VAR_MAX) << GDK_VARSHIFT) >> 30); return 0; } - if (h->free + pad + len + extralen < h->maxsize) { - /* if there is reserved space, first use the - * reserved space */ - newsize = MIN(newsize, h->maxsize); - } HEAPDEBUG fprintf(stderr, "#HEAPextend in strPut %s " SZFMT " " SZFMT "\n", h->filename, h->size, newsize); if (HEAPextend(h, newsize) < 0) { return 0; diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -2818,7 +2818,7 @@ BATassertHeadProps(BAT *b) p = BUNfirst(b); q = BUNlast(b); - assert(b->H->heap.size <= b->H->heap.maxsize); + assert(b->H->heap.size == b->H->heap.maxsize); assert(b->H->heap.free >= headsize(b, BUNlast(b))); if (b->htype != TYPE_void) { assert(b->batCount <= b->batCapacity); diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c --- a/gdk/gdk_heap.c +++ b/gdk/gdk_heap.c @@ -69,7 +69,7 @@ typedef struct heap_cache_e { void *base; size_t maxsz; - char fn[PATHLENGTH]; /* tmp file name */ + char fn[8]; /* tmp file name */ } heap_cache_e; typedef struct heap_cache { @@ -102,9 +102,9 @@ HEAPcacheInit(void) GDKcreatedir(HCDIR DIR_SEP_STR); /* clean old leftovers */ for (i = 0; i < HEAP_CACHE_SIZE; i++) { - char fn[PATHLENGTH]; + char fn[8]; - snprintf(fn, PATHLENGTH, "%d", i); + snprintf(fn, sizeof(fn), "%d", i); GDKunlink(HCDIR, fn, NULL); } MT_lock_unset(&HEAPcacheLock, "HEAPcache_init"); @@ -123,7 +123,7 @@ HEAPcacheAdd(void *base, size_t maxsz, c e->base = base; e->maxsz = maxsz; - snprintf(e->fn, PATHLENGTH, "%d", hc.used); + snprintf(e->fn, sizeof(e->fn), "%d", hc.used); GDKunlink(HCDIR, e->fn, NULL); added = 1; if (GDKmove(BATDIR, fn, NULL, HCDIR, e->fn, NULL) < 0) { @@ -149,48 +149,49 @@ HEAPcacheAdd(void *base, size_t maxsz, c static void * HEAPcacheFind(size_t *maxsz, char *fn, storage_t mode) { + size_t size = *maxsz; void *base = NULL; - *maxsz = (1 + (*maxsz >> 16)) << 16; /* round up to 64K */ + size = (*maxsz + (size_t) 0xFFFF) & ~ (size_t) 0xFFFF; /* round up to 64k */ MT_lock_set(&HEAPcacheLock, "HEAPcache_init"); if (mode == STORE_MMAP && hc.used > 0) { int i; heap_cache_e *e = NULL; size_t cursz = 0; - HEAPDEBUG fprintf(stderr, "#HEAPcacheFind (%s)" SZFMT " %d %d\n", fn, *maxsz, (int) mode, hc.used); + HEAPDEBUG fprintf(stderr, "#HEAPcacheFind (%s)" SZFMT " %d %d\n", fn, size, (int) mode, hc.used); /* find best match: prefer smallest larger than or * equal to requested, otherwise largest smaller than * requested */ for (i = 0; i < hc.used; i++) { - if ((hc.hc[i].maxsz >= *maxsz && - (e == NULL || hc.hc[i].maxsz < cursz || cursz < *maxsz)) || - (hc.hc[i].maxsz < *maxsz && - cursz < *maxsz && + if ((hc.hc[i].maxsz >= size && + (e == NULL || hc.hc[i].maxsz < cursz || cursz < size)) || + (hc.hc[i].maxsz < size && + cursz < size && hc.hc[i].maxsz > cursz)) { e = hc.hc + i; cursz = e->maxsz; } } - if (e != NULL && e->maxsz < *maxsz) { + if (e != NULL && e->maxsz < size) { /* resize file ? */ long_str fn; GDKfilepath(fn, HCDIR, e->fn, NULL); - base = MT_mremap(fn, MMAP_READ | MMAP_WRITE, e->base, e->maxsz, *maxsz); + base = MT_mremap(fn, MMAP_READ | MMAP_WRITE, e->base, e->maxsz, size); if (base == NULL) { /* extending may have failed */ e = NULL; } else { e->base = base; - e->maxsz = *maxsz; + e->maxsz = size; } } if (e != NULL) { /* move cached heap to its new location */ base = e->base; - *maxsz = e->maxsz; + size = e->maxsz; if (GDKmove(HCDIR, e->fn, NULL, BATDIR, fn, NULL) < 0) { /* try to create the directory, if * that was the problem */ @@ -218,10 +219,15 @@ HEAPcacheFind(size_t *maxsz, char *fn, s if (fd >= 0) { close(fd); - return GDKload(fn, NULL, *maxsz, *maxsz, mode); + base = GDKload(fn, NULL, size, size, mode); + if (base) + *maxsz = size; + return base; } } else HEAPDEBUG fprintf(stderr, "#HEAPcacheFind (%s) re-used\n", fn); + if (base) + *maxsz = size; return base; } @@ -248,24 +254,6 @@ decompose_filename(str nme) * seek. This is fast, and leads to files-with-holes on Unixes (on * Windows, it actually always performs I/O which is not nice). */ -static size_t -HEAPmargin(size_t maxsize) -{ - size_t ret; -#if SIZEOF_VOID_P == 8 - /* in 64-bits systems, try to enforce in-place realloc, but - * provoke the memcpy on 256MB, then 4GB */ - size_t use = GDKvm_cursize(); - ret = MIN(GDK_mem_maxsize, MAX(((size_t) 1) << 26, 16 * maxsize)); - if ((ret + ret) > (GDK_vm_maxsize - MIN(GDK_vm_maxsize, use))) /* only if room */ -#endif - ret = ((size_t) (((double) BATMARGIN) * (double) maxsize)) - 1; /* do not waste VM on 32-bits */ - HEAPDEBUG fprintf(stderr, "#HEAPmargin " SZFMT " -> " SZFMT "\n", - maxsize, (1 + (MAX(maxsize, ret) >> 16)) << 16); - return (1 + (MAX(maxsize, ret) >> 16)) << 16; /* round up to 64K */ -} - -/* in 64-bits space, use very large margins to accommodate reallocations */ int HEAPalloc(Heap *h, size_t nitems, size_t itemsize) { @@ -298,7 +286,8 @@ HEAPalloc(Heap *h, size_t nitems, size_t if (h->filename == NULL || (h->size < minsize)) { h->storage = STORE_MEM; - h->base = (char *) GDKmallocmax(h->size, &h->maxsize, 0); + h->base = (char *) GDKmallocmax(h->size, &h->size, 0); + h->maxsize = h->size; HEAPDEBUG fprintf(stderr, "#HEAPalloc " SZFMT " " SZFMT " " PTRFMT "\n", h->size, h->maxsize, PTRFMTCAST h->base); } if (h->filename && h->base == NULL) { @@ -308,7 +297,8 @@ HEAPalloc(Heap *h, size_t nitems, size_t if (stat(nme, &st) != 0) { h->storage = STORE_MMAP; - h->base = HEAPcacheFind(&h->maxsize, of, h->storage); + h->base = HEAPcacheFind(&h->size, of, h->storage); + h->maxsize = h->size; h->filename = of; } else { char *ext; @@ -396,23 +386,16 @@ HEAPextend(Heap *h, size_t size) * of anonymous MMAP in GDKmalloc */ int must_mmap = can_mmap && (small_cpy || exceeds_swap || h->newstorage != STORE_MEM || size >= GDK_mem_bigsize); - h->size = size; - - if (can_mmap) { - /* in anonymous vm, if have to realloc anyway, - * we reserve some extra space */ - h->maxsize = HEAPmargin(MAX(size, h->maxsize)); - } else { - h->maxsize = size; /* for normal GDKmalloc, maxsize = size */ - } + h->maxsize = h->size = size; /* try GDKrealloc if the heap size stays within * reasonable limits */ if (!must_mmap) { void *p = h->base; h->newstorage = h->storage = STORE_MEM; - 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); + h->base = GDKreallocmax(h->base, size, &h->size, 0); + h->maxsize = h->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; } @@ -440,8 +423,9 @@ HEAPextend(Heap *h, size_t size) if (h->filename == NULL) goto failed; sprintf(h->filename, "%s.%s", nme, ext); - h->base = HEAPcacheFind(&h->maxsize, h->filename, STORE_MMAP); + h->base = HEAPcacheFind(&h->size, h->filename, STORE_MMAP); if (h->base) { + h->maxsize = h->size; h->newstorage = h->storage = STORE_MMAP; memcpy(h->base, bak.base, bak.free); HEAPfree(&bak); @@ -614,7 +598,7 @@ HEAPfree_(Heap *h, int free_file) HEAPDEBUG fprintf(stderr, "#HEAPfree " SZFMT " " SZFMT " " PTRFMT "\n", h->size, h->maxsize, PTRFMTCAST h->base); GDKfree(h->base); } else { /* mapped file, or STORE_PRIV */ - int ret = HEAPcacheAdd(h->base, h->maxsize, h->filename, h->storage, free_file); + int ret = HEAPcacheAdd(h->base, h->size, h->filename, h->storage, free_file); if (ret < 0) { GDKsyserror("HEAPfree: %s was not mapped\n", h->filename); @@ -623,7 +607,7 @@ HEAPfree_(Heap *h, int free_file) HEAPDEBUG fprintf(stderr, "#munmap(base=" PTRFMT ", size=" SZFMT ") = %d\n", PTRFMTCAST(void *)h->base, - h->maxsize, ret); + h->size, ret); } } h->base = NULL; @@ -667,10 +651,8 @@ HEAPload_intern(Heap *h, const char *nme /* round up mmap heap sizes to REMAP_PAGE_MAXSIZE (usually * 512KB) segments */ - if ((h->storage != STORE_MEM) && (minsize != h->size)) { - h->size = minsize; - h->maxsize = MAX(minsize, h->maxsize); - } + if (h->storage != STORE_MEM && minsize != h->size) + h->maxsize = h->size = minsize; /* when a bat is made read-only, we can truncate any unused * space at the end of the heap */ @@ -822,7 +804,7 @@ size_t HEAPvmsize(Heap *h) { if (h && h->free) - return h->maxsize; + return h->size; return 0; } diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c --- a/gdk/gdk_posix.c +++ b/gdk/gdk_posix.c @@ -389,7 +389,7 @@ MT_munmap(void *p, size_t len) int ret = munmap(p, len); #ifdef MMAP_DEBUG - fprintf(stderr, "#munmap(" PTRFMT "," SZFMT ",%d) = %d\n", PTRFMTCAST p, len, ret); + fprintf(stderr, "#munmap(" PTRFMT "," SZFMT ") = %d\n", PTRFMTCAST p, len, ret); #endif return ret; } @@ -411,7 +411,10 @@ MT_mremap(const char *path, int mode, vo if (new_size < old_size) { /* shrink */ - munmap((char *) old_address + new_size, old_size - new_size); + if (munmap((char *) old_address + new_size, + old_size - new_size) < 0) + return NULL; + truncate(path, (off_t) new_size); #ifdef MMAP_DEBUG fprintf(stderr, "MT_mremap(%s,"PTRFMT","SZFMT","SZFMT") -> shrinking\n", path?path:"NULL", PTRFMTCAST old_address, old_size, new_size); #endif diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c --- a/gdk/gdk_storage.c +++ b/gdk/gdk_storage.c _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list