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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list