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

Reply via email to