Changeset: 6e66a3163b55 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6e66a3163b55
Modified Files:
        gdk/gdk.h
        gdk/gdk_private.h
        gdk/gdk_utils.c
Branch: default
Log Message:

With GCC we can provide more information when using ALLOCMASK.
When compiled with GCC and with debugging enabled (NDEBUG not
defined), we replace calls to the various allocation functions with
versions that optionally print the arguments, results, and where the
function was called from.  This information is an extension of the old
code which only printed the arguments and results.


diffs (259 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2230,6 +2230,87 @@ gdk_export void *GDKzalloc(size_t size);
 gdk_export void *GDKrealloc(void *pold, size_t size);
 gdk_export void GDKfree(void *blk);
 gdk_export str GDKstrdup(const char *s);
+#if !defined(NDEBUG) && defined(__GNUC__)
+#define GDKMALLOC_DEBUG
+#endif
+#ifdef GDKMALLOC_DEBUG
+#define GDKmalloc(s)                                                   \
+       ({                                                              \
+               size_t _size = (s);                                     \
+               void *_res = GDKmalloc(_size);                          \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKmalloc(" SZFMT ") -> " PTRFMT      \
+                               " %s[%s:%d]\n",                         \
+                               _size, PTRFMTCAST _res,                 \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+       })
+#define GDKzalloc(s)                                                   \
+       ({                                                              \
+               size_t _size = (s);                                     \
+               void *_res = GDKzalloc(_size);                          \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKzalloc(" SZFMT ") -> " PTRFMT      \
+                               " %s[%s:%d]\n",                         \
+                               _size, PTRFMTCAST _res,                 \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+       })
+#define GDKrealloc(p,s)                                                        
\
+       ({                                                              \
+               void *_ptr = (p);                                       \
+               size_t _size = (s);                                     \
+               void *_res = GDKrealloc(_ptr,_size);                    \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKrealloc(" PTRFMT "," SZFMT ") -> " PTRFMT \
+                               " %s[%s:%d]\n",                         \
+                               PTRFMTCAST _ptr, _size, PTRFMTCAST _res, \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+        })
+#define GDKfree(p)                                                     \
+       ({                                                              \
+               void *_ptr = (p);                                       \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKfree(" PTRFMT ")"                  \
+                               " %s[%s:%d]\n",                         \
+                               PTRFMTCAST _ptr,                        \
+                               __func__, __FILE__, __LINE__);          \
+               GDKfree(_ptr);                                          \
+       })
+#define GDKstrdup(s)                                                   \
+       ({                                                              \
+               const char *_str = (s);                                 \
+               void *_res = GDKstrdup(_str);                           \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKstrdup(len=" SZFMT ") -> " PTRFMT  \
+                               " %s[%s:%d]\n",                         \
+                               strlen(_str),                           \
+                               PTRFMTCAST _res,                        \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+       })
+#define GDKmmap(p, m, l)                                               \
+       ({                                                              \
+               const char *_path = (p);                                \
+               int _mode = (m);                                        \
+               size_t _len = (l);                                      \
+               void *_res = GDKmmap(_path, _mode, _len);               \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKmmap(%s,0x%x," SZFMT ") -> " SZFMT \
+                               " %s[%s:%d]\n",                         \
+                               _path ? _path : "NULL", _mode, _len,    \
+                               PTRFMTCAST _res,                        \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+        })
+#endif
 
 /*
  * @- GDK error handling
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -166,3 +166,46 @@ extern MT_Lock MT_system_lock;
 #define SORTloop_var(b,p,q,tl,th) SORTloop_loc(b,p,q,tl,th)
 
 #define SORTloop_bit(b,p,q,tl,th) SORTloop_bte(b,p,q,tl,th)
+
+#ifdef GDKMALLOC_DEBUG
+#define GDKallocmax(s,ps,e)                                            \
+       ({                                                              \
+               size_t _size = (s);                                     \
+               size_t *_psize  = (ps);                                 \
+               void *_res = GDKmallocmax(_size,_psize,e);              \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKmallocmax(" SZFMT ",(" SZFMT ")) -> " \
+                               PTRFMT " %s[%s:%d]\n",                  \
+                               _size, *_psize, PTRFMTCAST _res,        \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+        })
+#define GDKmunmap(p, l)                                                        
\
+       ({      void *_ptr = (p);                                       \
+               size_t _len = (l);                                      \
+               int _res = GDKmunmap(_ptr, _len);                       \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKmunmap(" PTRFMT "," SZFMT ") -> %d" \
+                               " %s[%s:%d]\n",                         \
+                               PTRFMTCAST _ptr, _len, _res,            \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+       })
+#define GDKreallocmax(p,s,ps,e)                                                
\
+       ({                                                              \
+               void *_ptr = (p);                                       \
+               size_t _size = (s);                                     \
+               size_t *_psize  = (ps);                                 \
+               void *_res = GDKreallocmax(_ptr,_size,_psize,e);        \
+               ALLOCDEBUG                                              \
+                       fprintf(stderr,                                 \
+                               "#GDKreallocmax(" PTRFMT "," SZFMT \
+                               ",(" SZFMT ")) -> " PTRFMT              \
+                               " %s[%s:%d]\n", PTRFMTCAST _ptr,        \
+                               _size, *_psize, PTRFMTCAST _res,        \
+                               __func__, __FILE__, __LINE__);          \
+               _res;                                                   \
+        })
+#endif
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -653,6 +653,7 @@ GDKmemfail(str s, size_t len)
  * The emergency flag can be set to force a fatal error if needed.
  * Otherwise, the caller is able to deal with the lack of memory.
  */
+#undef GDKmallocmax
 void *
 GDKmallocmax(size_t size, size_t *maxsize, int emergency)
 {
@@ -685,11 +686,14 @@ GDKmallocmax(size_t size, size_t *maxsiz
        return (void *) s;
 }
 
+#undef GDKmalloc
 void *
 GDKmalloc(size_t size)
 {
        void *p = GDKmallocmax(size, &size, 0);
+#ifndef GDKMALLOC_DEBUG
        ALLOCDEBUG fprintf(stderr, "#GDKmalloc " SZFMT " " PTRFMT "\n", size, 
PTRFMTCAST p);
+#endif
 #ifndef NDEBUG
        DEADBEEFCHK if (p)
                memset(p, 0xBD, size);
@@ -697,12 +701,15 @@ GDKmalloc(size_t size)
        return p;
 }
 
+#undef GDKzalloc
 void *
 GDKzalloc(size_t size)
 {
        size_t maxsize = size;
        void *p = GDKmallocmax(size, &maxsize, 0);
+#ifndef GDKMALLOC_DEBUG
        ALLOCDEBUG fprintf(stderr, "#GDKzalloc " SZFMT " " SZFMT " " PTRFMT 
"\n", size, maxsize, PTRFMTCAST p);
+#endif
        if (p) {
                memset(p, 0, size);
 #ifndef NDEBUG
@@ -750,13 +757,17 @@ GDKfree_(void *blk)
        heapdec(size);
 }
 
+#undef GDKfree
 void
 GDKfree(void *blk)
 {
+#ifndef GDKMALLOC_DEBUG
        ALLOCDEBUG fprintf(stderr, "#GDKfree " PTRFMT "\n", PTRFMTCAST blk);
+#endif
        GDKfree_(blk);
 }
 
+#undef GDKreallocmax
 ptr
 GDKreallocmax(void *blk, size_t size, size_t *maxsize, int emergency)
 {
@@ -815,18 +826,22 @@ GDKreallocmax(void *blk, size_t size, si
        return blk;
 }
 
+#undef GDKrealloc
 ptr
 GDKrealloc(void *blk, size_t size)
 {
        size_t sz = size;
        void *p;
 
-       p = GDKreallocmax(blk, size, &size, 0);
+       p = GDKreallocmax(blk, sz, &size, 0);
+#ifndef GDKMALLOC_DEBUG
        ALLOCDEBUG fprintf(stderr, "#GDKrealloc " SZFMT " " SZFMT " " PTRFMT " 
" PTRFMT "\n", sz, size, PTRFMTCAST blk, PTRFMTCAST p);
+#endif
        return p;
 }
 
 
+#undef GDKstrdup
 char *
 GDKstrdup(const char *s)
 {
@@ -843,6 +858,7 @@ GDKstrdup(const char *s)
  * @- virtual memory
  * allocations affect only the logical VM resources.
  */
+#undef GDKmmap
 void *
 GDKmmap(const char *path, int mode, size_t len)
 {
@@ -855,7 +871,9 @@ GDKmmap(const char *path, int mode, size
                        THRprintf(GDKstdout, "#GDKmmap: recovery ok. 
Continuing..\n");
                }
        }
+#ifndef GDKMALLOC_DEBUG
        ALLOCDEBUG fprintf(stderr, "#GDKmmap " SZFMT " " PTRFMT "\n", len, 
PTRFMTCAST ret);
+#endif
        if (ret != (void *) -1L) {
                /* since mmap directly have content we say it's zero-ed
                 * memory */
@@ -865,12 +883,15 @@ GDKmmap(const char *path, int mode, size
        return (void *) ret;
 }
 
+#undef GDKmunmap
 int
 GDKmunmap(void *addr, size_t size)
 {
        int ret;
 
+#ifndef GDKMALLOC_DEBUG
        ALLOCDEBUG fprintf(stderr, "#GDKmunmap " SZFMT " " PTRFMT "\n", size, 
PTRFMTCAST addr);
+#endif
        ret = MT_munmap(addr, size);
        VALGRIND_FREELIKE_BLOCK(addr, 0);
        if (ret == 0)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to