Changeset: f38312e1bec9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f38312e1bec9 Modified Files: gdk/gdk_heap.c gdk/gdk_posix.c gdk/gdk_private.h gdk/gdk_storage.c Branch: default Log Message:
Merge with Feb2013 branch. diffs (151 lines): diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c --- a/gdk/gdk_heap.c +++ b/gdk/gdk_heap.c @@ -179,7 +179,8 @@ HEAPcacheFind(size_t *maxsz, char *fn, s long_str fn; GDKfilepath(fn, HCDIR, e->fn, NULL); - base = MT_mremap(fn, MMAP_READ | MMAP_WRITE, e->base, e->maxsz, &size); + base = MT_mremap(fn, MMAP_READ | MMAP_WRITE, + e->base, e->maxsz, &size); if (base == NULL) { /* extending may have failed */ e = NULL; @@ -474,6 +475,55 @@ HEAPextend(Heap *h, size_t size) } int +HEAPshrink(Heap *h, size_t size) +{ + char *p; + + assert(size >= h->free); + assert(size <= h->size); + if (h->storage == STORE_MEM) { + p = GDKreallocmax(h->base, size, &size, 0); + HEAPDEBUG fprintf(stderr, "#HEAPshrink: shrinking malloced " + "heap " SZFMT " " SZFMT " " PTRFMT " " + PTRFMT "\n", h->size, size, + PTRFMTCAST h->base, PTRFMTCAST p); + } else { + char nme[PATHLENGTH], *ext = NULL; + long_str path; + + if (h->filename) { + strncpy(nme, h->filename, sizeof(nme)); + nme[sizeof(nme) - 1] = 0; + ext = decompose_filename(nme); + } + /* shrink memory mapped file */ + GDKfilepath(path, BATDIR, nme, ext); + size = (size + MT_pagesize() - 1) & ~(MT_pagesize() - 1); + if (size >= h->size) { + /* don't grow */ + return 0; + } + p = MT_mremap(path, + h->storage == STORE_PRIV ? + MMAP_COPY | MMAP_READ | MMAP_WRITE : + MMAP_READ | MMAP_WRITE, + h->base, h->size, &size); + HEAPDEBUG fprintf(stderr, "#HEAPshrink: shrinking %s mmapped " + "heap (%s) " SZFMT " " SZFMT " " PTRFMT " " + PTRFMT "\n", + h->storage == STORE_MMAP ? "shared" : "privately", + h->filename, h->size, size, + PTRFMTCAST h->base, PTRFMTCAST p); + } + if (p) { + h->size = size; + h->base = p; + return 0; + } + return -1; +} + +int GDKupgradevarheap(COLrec *c, var_t v, int copyall) { bte shift = c->shift; diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c --- a/gdk/gdk_posix.c +++ b/gdk/gdk_posix.c @@ -371,6 +371,7 @@ MT_mmap(const char *path, int mode, size int fd = open(path, O_CREAT | ((mode & MMAP_WRITE) ? O_RDWR : O_RDONLY), MONETDB_MODE); void *ret = (void *) -1L; + assert(len % MT_pagesize() == 0); if (fd >= 0) { ret = mmap(NULL, len, @@ -388,6 +389,7 @@ MT_munmap(void *p, size_t len) { int ret = munmap(p, len); + assert(len % MT_pagesize() == 0); #ifdef MMAP_DEBUG fprintf(stderr, "#munmap(" PTRFMT "," SZFMT ") = %d\n", PTRFMTCAST p, len, ret); #endif @@ -408,6 +410,9 @@ MT_mremap(const char *path, int mode, vo /* doesn't make sense for us to extend read-only memory map */ assert(mode & MMAP_WRITABLE); + assert(old_size % MT_pagesize() == 0); + assert(*new_size % MT_pagesize() == 0); + assert((size_t) old_address % MT_pagesize() == 0); if (*new_size < old_size) { /* shrink */ @@ -697,6 +702,7 @@ MT_mmap(const char *path, int mode, size HANDLE h1, h2; void *ret; + assert(len % MT_pagesize() == 0); if (mode & MMAP_WRITE) { mode0 |= FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_DATA; } @@ -767,6 +773,9 @@ MT_mremap(const char *path, int mode, vo /* doesn't make sense for us to extend read-only memory map */ assert(mode & MMAP_WRITABLE); + assert(old_size % MT_pagesize() == 0); + assert(*new_size % MT_pagesize() == 0); + assert((size_t) old_address % MT_pagesize() == 0); if (old_size >= *new_size) { *new_size = old_size; diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -79,6 +79,7 @@ void HEAP_init(Heap *heap, int tpe); int HEAPload(Heap *h, const char *nme, const char *ext, int trunc); int HEAP_mmappable(Heap *heap); int HEAPsave(Heap *h, const char *nme, const char *ext); +int HEAPshrink(Heap *h, size_t size); int HEAPwarm(Heap *h); oid MAXoid(BAT *i); void MT_global_exit(int status) diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c --- a/gdk/gdk_storage.c +++ b/gdk/gdk_storage.c @@ -640,6 +640,20 @@ BATsave(BAT *bd) if (err == 0) { bd->batCopiedtodisk = 1; DESCclean(bd); + if (bd->htype && bd->H->heap.storage == STORE_MMAP) { + HEAPshrink(&bd->H->heap, bd->H->heap.free); + if (bd->U->capacity > bd->H->heap.size >> bd->H->shift) + bd->U->capacity = bd->H->heap.size >> bd->H->shift; + } + if (bd->ttype && bd->T->heap.storage == STORE_MMAP) { + HEAPshrink(&bd->T->heap, bd->T->heap.free); + if (bd->U->capacity > bd->T->heap.size >> bd->T->shift) + bd->U->capacity = bd->T->heap.size >> bd->T->shift; + } + if (bd->H->vheap && bd->H->vheap->storage == STORE_MMAP) + HEAPshrink(bd->H->vheap, bd->H->vheap->free); + if (bd->T->vheap && bd->T->vheap->storage == STORE_MMAP) + HEAPshrink(bd->T->vheap, bd->T->vheap->free); return bd; } return NULL; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list