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