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