Changeset: bd266b130386 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bd266b130386
Modified Files:
        gdk/gdk_posix.c
        gdk/gdk_utils.c
Branch: Jun2016
Log Message:

Push valgrind macros down into MT_mmap and friends.
We need more control because at the higher level of GDKmmap we can't
properly deal with mremap and partial munmap.


diffs (170 lines):

diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -42,6 +42,19 @@
 # include <sys/user.h>
 #endif
 
+#ifdef NDEBUG
+#ifndef NVALGRIND
+#define NVALGRIND NDEBUG
+#endif
+#endif
+
+#if defined(__GNUC__) && defined(HAVE_VALGRIND)
+#include <valgrind.h>
+#else
+#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)
+#define VALGRIND_FREELIKE_BLOCK(addr, rzB)
+#endif
+
 #ifndef MAP_NORESERVE
 # define MAP_NORESERVE         MAP_PRIVATE
 #endif
@@ -356,6 +369,7 @@ MT_mmap(const char *path, int mode, size
                ret = NULL;
        }
        close(fd);
+       VALGRIND_MALLOCLIKE_BLOCK(ret, len, 0, 1);
        return ret;
 }
 
@@ -367,6 +381,7 @@ MT_munmap(void *p, size_t len)
        if (ret < 0)
                GDKsyserror("MT_munmap: munmap(" PTRFMT "," SZFMT ") failed\n",
                            PTRFMTCAST p, len);
+       VALGRIND_FREELIKE_BLOCK(p, 0);
 #ifdef MMAP_DEBUG
        fprintf(stderr, "#munmap(" PTRFMT "," SZFMT ") = %d\n", PTRFMTCAST p, 
len, ret);
 #endif
@@ -394,6 +409,7 @@ MT_mremap(const char *path, int mode, vo
        if (*new_size < old_size) {
 #ifndef STATIC_CODE_ANALYSIS   /* hide this from static code analyzer */
                /* shrink */
+               VALGRIND_RESIZEINPLACE_BLOCK(old_address, old_size, *new_size, 
0);
                if (munmap((char *) old_address + *new_size,
                           old_size - *new_size) < 0) {
                        GDKsyserror("MT_mremap: munmap("PTRFMT","SZFMT") 
failed\n",
@@ -442,6 +458,14 @@ MT_mremap(const char *path, int mode, vo
                        GDKsyserror("MT_mremap: 
mremap("PTRFMT","SZFMT","SZFMT") failed\n",
                                    PTRFMTCAST old_address, old_size,
                                    *new_size);
+#ifdef HAVE_VALGRIND
+               if (p == old_address) {
+                       VALGRIND_RESIZEINPLACE_BLOCK(old_address, old_size, 
*new_size, 0);
+               } else {
+                       VALGRIND_FREELIKE_BLOCK(old_address, 0);
+                       VALGRIND_MALLOCLIKE_BLOCK(p, *new_size, 0, 1);
+               }
+#endif
 #else
                /* try to map extension at end of current map */
                p = mmap((char *) old_address + old_size, *new_size - old_size,
@@ -453,6 +477,7 @@ MT_mremap(const char *path, int mode, vo
                                /* we got the requested address, make
                                 * sure we return the correct (old)
                                 * address */
+                               VALGRIND_RESIZEINPLACE_BLOCK(old_address, 
old_size, *new_size, 0);
                                p = old_address;
                        } else {
                                /* we got some other address: discard
@@ -464,8 +489,11 @@ MT_mremap(const char *path, int mode, vo
                                /* first create full mmap, then, if
                                 * successful, remove old mmap */
                                p = mmap(NULL, *new_size, prot, flags, fd, 0);
-                               if (p != MAP_FAILED)
+                               if (p != MAP_FAILED) {
+                                       VALGRIND_MALLOCLIKE_BLOCK(p, *new_size, 
0, 1);
                                        munmap(old_address, old_size);
+                                       VALGRIND_FREELIKE_BLOCK(old_address, 0);
+                               }
                        }
                }
                if (p == MAP_FAILED)
@@ -494,6 +522,7 @@ MT_mremap(const char *path, int mode, vo
                                /* we got the requested address, make
                                 * sure we return the correct (old)
                                 * address */
+                               VALGRIND_RESIZEINPLACE_BLOCK(old_address, 
old_size, *new_size, 0);
                                p = old_address;
                        } else {
                                /* we got some other address: discard
@@ -517,6 +546,12 @@ MT_mremap(const char *path, int mode, vo
                                                munmap(p, *new_size);
                                                p = MAP_FAILED;
                                        }
+#ifdef HAVE_VALGRIND
+                                       else {
+                                               
VALGRIND_FREELIKE_BLOCK(old_size, 0);
+                                               VALGRIND_MALLOCLIKE_BLOCK(p, 
*new_size, 0, 1);
+                                       }
+#endif
                                }
 #else
                                p = MAP_FAILED;
@@ -529,9 +564,11 @@ MT_mremap(const char *path, int mode, vo
                                        p = mmap(NULL, *new_size, prot, flags,
                                                 fd, 0);
                                        if (p != MAP_FAILED) {
+                                               VALGRIND_MALLOCLIKE_BLOCK(p, 
*new_size, 0, 0);
                                                memcpy(p, old_address,
                                                       old_size);
                                                munmap(old_address, old_size);
+                                               
VALGRIND_FREELIKE_BLOCK(old_address, 0);
                                        }
                                        /* if it failed, try alternative */
                                }
@@ -603,8 +640,11 @@ MT_mremap(const char *path, int mode, vo
                                        }
                                        p = mmap(NULL, *new_size, prot, flags,
                                                 fd, 0);
-                                       if (p != MAP_FAILED)
+                                       if (p != MAP_FAILED) {
+                                               VALGRIND_MALLOCLIKE_BLOCK(p, 
*new_size, 0, 1);
                                                munmap(old_address, old_size);
+                                               
VALGRIND_FREELIKE_BLOCK(old_address, 0);
+                                       }
                                }
 #endif /* HAVE_MREMAP */
                        }
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -49,19 +49,6 @@ static char THRprintbuf[BUFSIZ];
 #define chdir _chdir
 #endif
 
-#ifdef NDEBUG
-#ifndef NVALGRIND
-#define NVALGRIND NDEBUG
-#endif
-#endif
-
-#if defined(__GNUC__) && defined(HAVE_VALGRIND)
-#include <valgrind.h>
-#else
-#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)
-#define VALGRIND_FREELIKE_BLOCK(addr, rzB)
-#endif
-
 static volatile ATOMIC_FLAG GDKstopped = ATOMIC_FLAG_INIT;
 static void GDKunlockHome(void);
 
@@ -939,9 +926,6 @@ GDKmmap(const char *path, int mode, size
                }
        }
        if (ret != NULL) {
-               /* since mmap directly have content we say it's zero-ed
-                * memory */
-               VALGRIND_MALLOCLIKE_BLOCK(ret, len, 0, 1);
                meminc(len);
        }
        return ret;
@@ -954,7 +938,6 @@ GDKmunmap(void *addr, size_t size)
        int ret;
 
        ret = MT_munmap(addr, size);
-       VALGRIND_FREELIKE_BLOCK(addr, 0);
        if (ret == 0)
                memdec(size);
        return ret == 0 ? GDK_SUCCEED : GDK_FAIL;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to