Changeset: 7145f5afe4d8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7145f5afe4d8
Modified Files:
        buildtools/coverity_model.c
        clients/Tests/exports.stable.out
        gdk/gdk_heap.c
        gdk/gdk_posix.h
        gdk/gdk_utils.c
        gdk/gdk_utils.h
        monetdb5/modules/mal/mal_io.c
Branch: default
Log Message:

Count copy-on-write memory maps towards malloced memory.
This means that GDK_vm_cursize is exclusively file-backed memory maps.


diffs (281 lines):

diff --git a/buildtools/coverity_model.c b/buildtools/coverity_model.c
--- a/buildtools/coverity_model.c
+++ b/buildtools/coverity_model.c
@@ -126,7 +126,7 @@ GDKmmap(const char *path, int mode, size
 }
 
 gdk_return
-GDKmunmap(void *p, size_t size)
+GDKmunmap(void *p, int mode, size_t size)
 {
        int failed;
        __coverity_free__(p);
@@ -139,7 +139,7 @@ GDKmremap(const char *path, int mode, vo
 {
        void *p = GDKmmap(path, mode, new_size);
        if (p) {
-               (void) GDKmunmap(old_address, old_size);
+               (void) GDKmunmap(old_address, mode, old_size);
        }
        return p;
 }
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -299,7 +299,7 @@ size_t GDKmem_cursize(void);
 gdk_return GDKmergeidx(BAT *b, BAT **a, int n_ar);
 void *GDKmmap(const char *path, int mode, size_t len) 
__attribute__((__warn_unused_result__));
 int GDKms(void);
-gdk_return GDKmunmap(void *addr, size_t len);
+gdk_return GDKmunmap(void *addr, int mode, size_t len);
 int GDKnr_threads;
 void GDKprepareExit(void);
 void GDKprintinfo(void);
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -687,7 +687,11 @@ HEAPfree(Heap *h, bool rmheap)
                        //heap is stored in regular C memory rather than GDK 
memory,so we call free()
                        free(h->base);
                } else if (h->storage != STORE_NOWN) {  /* mapped file, or 
STORE_PRIV */
-                       gdk_return ret = GDKmunmap(h->base, h->size);
+                       gdk_return ret = GDKmunmap(h->base,
+                                                  h->storage == STORE_PRIV ?
+                                                  MMAP_COPY | MMAP_READ | 
MMAP_WRITE :
+                                                  MMAP_READ | MMAP_WRITE,
+                                                  h->size);
 
                        if (ret != GDK_SUCCEED) {
                                GDKsyserror("HEAPfree: %s was not mapped\n",
diff --git a/gdk/gdk_posix.h b/gdk/gdk_posix.h
--- a/gdk/gdk_posix.h
+++ b/gdk/gdk_posix.h
@@ -35,12 +35,6 @@
 #include <direct.h>
 #endif
 
-/*
- * @- virtual memory
- */
-#define MT_VMUNITLOG   16
-#define MT_VMUNITSIZE  (1 << MT_VMUNITLOG)
-
 /* make sure POSIX_MADV_* and posix_madvise() are defined somehow */
 #ifdef HAVE_SYS_MMAN_H
 # ifndef __USE_BSD
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -452,7 +452,7 @@ size_t GDK_mmap_pagesize = MMAP_PAGESIZE
 size_t GDK_mem_maxsize = GDK_VM_MAXSIZE;
 size_t GDK_vm_maxsize = GDK_VM_MAXSIZE;
 
-#define SEG_SIZE(x,y)  ((x)+(((x)&((1<<(y))-1))?(1<<(y))-((x)&((1<<(y))-1)):0))
+#define SEG_SIZE(x)    ((ssize_t) (((x) + _MT_pagesize - 1) & ~(_MT_pagesize - 
1)))
 
 /* This block is to provide atomic addition and subtraction to select
  * variables.  We use intrinsic functions (recognized and inlined by
@@ -1666,13 +1666,30 @@ GDKvm_cursize(void)
 
 #define heapinc(_memdelta)                                             \
        ATOMIC_ADD(&GDK_mallocedbytes_estimate, _memdelta)
+#ifndef NDEBUG
+#define heapdec(_memdelta)                                                     
\
+       do {                                                            \
+               ATOMIC_BASE_TYPE old = ATOMIC_ADD(&GDK_mallocedbytes_estimate, 
_memdelta); \
+               assert(old >= (ATOMIC_BASE_TYPE) _memdelta);            \
+       } while (0)
+#else
 #define heapdec(_memdelta)                                             \
        ATOMIC_SUB(&GDK_mallocedbytes_estimate, _memdelta)
+#endif
 
 #define meminc(vmdelta)                                                        
\
-       ATOMIC_ADD(&GDK_vm_cursize, (ssize_t) SEG_SIZE((vmdelta), MT_VMUNITLOG))
+       ATOMIC_ADD(&GDK_vm_cursize, SEG_SIZE(vmdelta))
+#ifndef NDEBUG
 #define memdec(vmdelta)                                                        
\
-       ATOMIC_SUB(&GDK_vm_cursize, (ssize_t) SEG_SIZE((vmdelta), MT_VMUNITLOG))
+       do {                                                            \
+               ssize_t diff = SEG_SIZE(vmdelta);                       \
+               ATOMIC_BASE_TYPE old = ATOMIC_SUB(&GDK_vm_cursize, diff); \
+               assert(old >= (ATOMIC_BASE_TYPE) diff);                 \
+       } while (0)
+#else
+#define memdec(vmdelta)                                                        
\
+       ATOMIC_SUB(&GDK_vm_cursize, SEG_SIZE(vmdelta))
+#endif
 
 /* Memory allocation
  *
@@ -1954,22 +1971,29 @@ GDKmmap(const char *path, int mode, size
        }
 #endif
        ret = MT_mmap(path, mode, len);
-       if (ret != NULL)
-               meminc(len);
-       else
+       if (ret != NULL) {
+               if (mode & MMAP_COPY)
+                       heapinc(len);
+               else
+                       meminc(len);
+       } else
                GDKerror("requesting virtual memory failed; memory requested: 
%zu, memory in use: %zu, virtual memory in use: %zu\n", len, GDKmem_cursize(), 
GDKvm_cursize());
        return ret;
 }
 
 #undef GDKmunmap
 gdk_return
-GDKmunmap(void *addr, size_t size)
+GDKmunmap(void *addr, int mode, size_t size)
 {
        int ret;
 
        ret = MT_munmap(addr, size);
-       if (ret == 0)
-               memdec(size);
+       if (ret == 0) {
+               if (mode & MMAP_COPY)
+                       heapdec(size);
+               else
+                       memdec(size);
+       }
        return ret == 0 ? GDK_SUCCEED : GDK_FAIL;
 }
 
@@ -1989,8 +2013,13 @@ GDKmremap(const char *path, int mode, vo
 #endif
        ret = MT_mremap(path, mode, old_address, old_size, new_size);
        if (ret != NULL) {
-               memdec(old_size);
-               meminc(*new_size);
+               if (mode & MMAP_COPY) {
+                       heapdec(old_size);
+                       heapinc(*new_size);
+               } else {
+                       memdec(old_size);
+                       meminc(*new_size);
+               }
        } else {
                GDKerror("requesting virtual memory failed; memory requested: 
%zu, memory in use: %zu, virtual memory in use: %zu\n", *new_size, 
GDKmem_cursize(), GDKvm_cursize());
        }
diff --git a/gdk/gdk_utils.h b/gdk/gdk_utils.h
--- a/gdk/gdk_utils.h
+++ b/gdk/gdk_utils.h
@@ -79,7 +79,7 @@ gdk_export size_t GDK_vm_maxsize;     /* max
 
 gdk_export void *GDKmmap(const char *path, int mode, size_t len)
        __attribute__((__warn_unused_result__));
-gdk_export gdk_return GDKmunmap(void *addr, size_t len);
+gdk_export gdk_return GDKmunmap(void *addr, int mode, size_t len);
 
 gdk_export size_t GDKmem_cursize(void);        /* RAM/swapmem that MonetDB has 
claimed from OS */
 gdk_export size_t GDKvm_cursize(void); /* current MonetDB VM address space 
usage */
@@ -213,13 +213,15 @@ gdk_export int GDKms(void);
                          _res);                                        \
                _res;                                                   \
         })
-#define GDKmunmap(p, l)                                                \
-       ({      void *_ptr = (p);                               \
+#define GDKmunmap(p, m, l)                                     \
+       ({                                                      \
+               void *_ptr = (p);                               \
+               int _mode = (m);                                \
                size_t _len = (l);                              \
-               gdk_return _res = GDKmunmap(_ptr, _len);        \
+               gdk_return _res = GDKmunmap(_ptr, _mode, _len); \
                TRC_DEBUG(ALLOC,                                \
-                         "GDKmunmap(%p,%zu) -> %u\n",          \
-                         _ptr, _len, _res);                    \
+                         "GDKmunmap(%p,0x%x,%zu) -> %u\n",     \
+                         _ptr, _mode, _len, _res);             \
                _res;                                           \
        })
 #define malloc(s)                                      \
@@ -315,14 +317,14 @@ GDKmmap_debug(const char *path, int mode
 }
 #define GDKmmap(p, m, l)       GDKmmap_debug((p), (m), (l))
 static inline gdk_return
-GDKmunmap_debug(void *ptr, size_t len)
+GDKmunmap_debug(void *ptr, int mode, size_t len)
 {
-       gdk_return res = GDKmunmap(ptr, len);
-       TRC_DEBUG(ALLOC, "GDKmunmap(%p,%zu) -> %d\n",
-                 ptr, len, (int) res);
+       gdk_return res = GDKmunmap(ptr, mode, len);
+       TRC_DEBUG(ALLOC, "GDKmunmap(%p,0x%x%zu) -> %d\n",
+                 ptr, mode, len, (int) res);
        return res;
 }
-#define GDKmunmap(p, l)                GDKmunmap_debug((p), (l))
+#define GDKmunmap(p, m, l)     GDKmunmap_debug((p), (m), (l))
 static inline void *
 malloc_debug(size_t size)
 {
diff --git a/monetdb5/modules/mal/mal_io.c b/monetdb5/modules/mal/mal_io.c
--- a/monetdb5/modules/mal/mal_io.c
+++ b/monetdb5/modules/mal/mal_io.c
@@ -750,7 +750,7 @@ IOimport(void *ret, bat *bid, str *fnme)
                                                BBPunfix(b->batCacheid);
                                                GDKfree(buf);
                                                GDKfree(t);
-                                               GDKmunmap(base, end - base);
+                                               GDKmunmap(base, 
MMAP_SEQUENTIAL, end - base);
                                                throw(MAL, "io.import",
                                                          SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                                        }
@@ -775,7 +775,7 @@ IOimport(void *ret, bat *bid, str *fnme)
                                BBPunfix(b->batCacheid);
                                GDKfree(buf);
                                GDKfree(t);
-                               GDKmunmap(base, end - base);
+                               GDKmunmap(base, MMAP_SEQUENTIAL, end - base);
                                throw(MAL, "io.import", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        }
                        buf = tmp;
@@ -796,7 +796,7 @@ IOimport(void *ret, bat *bid, str *fnme)
                        BBPunfix(b->batCacheid);
                        snprintf(msg, sizeof(msg), "error in input %s", buf);
                        GDKfree(buf);
-                       GDKmunmap(base, end - base);
+                       GDKmunmap(base, MMAP_SEQUENTIAL, end - base);
                        GDKfree(t);
                        throw(MAL, "io.import", "%s", msg);
                }
@@ -805,7 +805,7 @@ IOimport(void *ret, bat *bid, str *fnme)
                        BBPunfix(b->batCacheid);
                        snprintf(msg, sizeof(msg), "error in input %s", buf);
                        GDKfree(buf);
-                       GDKmunmap(base, end - base);
+                       GDKmunmap(base, MMAP_SEQUENTIAL, end - base);
                        GDKfree(t);
                        throw(MAL, "io.import", "%s", msg);
                }
@@ -814,7 +814,7 @@ IOimport(void *ret, bat *bid, str *fnme)
                        BBPunfix(b->batCacheid);
                        GDKfree(buf);
                        GDKfree(t);
-                       GDKmunmap(base, end - base);
+                       GDKmunmap(base, MMAP_SEQUENTIAL, end - base);
                        throw(MAL, "io.import", "insert failed");
                }
 #if 0                                                  /* why do this? any 
measured effects? */
@@ -824,7 +824,7 @@ IOimport(void *ret, bat *bid, str *fnme)
 #ifndef WIN32
 #define MAXBUF 40*MT_pagesize()
                if ((unsigned) (cur - base) > MAXBUF) {
-                       GDKmunmap(base, MAXBUF);
+                       GDKmunmap(base, MMAP_SEQUENTIAL, MAXBUF);
                        base += MAXBUF;
                }
 #endif
@@ -834,7 +834,7 @@ IOimport(void *ret, bat *bid, str *fnme)
        if (t)
                GDKfree(t);
        GDKfree(buf);
-       GDKmunmap(base, end - base);
+       GDKmunmap(base, MMAP_SEQUENTIAL, end - base);
        BBPunfix(b->batCacheid);
        return MAL_SUCCEED;
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to