Bug 658995 part 1 - Properly divert memory allocation functions for trace malloc with standalone glue on Linux. r=dbaron
authorMike Hommey <mh+mozilla@glandium.org>
Wed, 15 Jun 2011 07:30:44 +0200
changeset 71200 eef5d644e17e778357ab31306136dc88fc52413c
parent 71199 f81579f78f92cc0be591fad1087d37ca5d388efe
child 71201 f4ddad2c0eb7d079abeba227758176ba4992f59e
push id101
push usermh@glandium.org
push dateFri, 17 Jun 2011 01:05:08 +0000
treeherdermozilla-inbound@cc18551d5cc3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdbaron
bugs658995
milestone7.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 658995 part 1 - Properly divert memory allocation functions for trace malloc with standalone glue on Linux. r=dbaron
xpcom/glue/standalone/nsGlueLinkingDlopen.cpp
--- a/xpcom/glue/standalone/nsGlueLinkingDlopen.cpp
+++ b/xpcom/glue/standalone/nsGlueLinkingDlopen.cpp
@@ -33,29 +33,94 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "nsGlueLinking.h"
 #include "nsXPCOMGlue.h"
+#include "nscore.h"
 
+#include <errno.h>
 #include <dlfcn.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 
 #if defined(SUNOS4) || defined(NEXTSTEP) || \
     (defined(OPENBSD) || defined(NETBSD)) && !defined(__ELF__)
 #define LEADING_UNDERSCORE "_"
 #else
 #define LEADING_UNDERSCORE
 #endif
 
+#ifdef NS_TRACE_MALLOC
+extern "C" {
+NS_EXPORT_(__ptr_t) __libc_malloc(size_t);
+NS_EXPORT_(__ptr_t) __libc_calloc(size_t, size_t);
+NS_EXPORT_(__ptr_t) __libc_realloc(__ptr_t, size_t);
+NS_EXPORT_(void)    __libc_free(__ptr_t);
+NS_EXPORT_(__ptr_t) __libc_memalign(size_t, size_t);
+NS_EXPORT_(__ptr_t) __libc_valloc(size_t);
+}
+
+static __ptr_t (*_malloc)(size_t) = __libc_malloc;
+static __ptr_t (*_calloc)(size_t, size_t) = __libc_calloc;
+static __ptr_t (*_realloc)(__ptr_t, size_t) = __libc_realloc;
+static void (*_free)(__ptr_t) = __libc_free;
+static __ptr_t (*_memalign)(size_t, size_t) = __libc_memalign;
+static __ptr_t (*_valloc)(size_t) = __libc_valloc;
+
+NS_EXPORT_(__ptr_t) malloc(size_t size)
+{
+    return _malloc(size);
+}
+
+NS_EXPORT_(__ptr_t) calloc(size_t nmemb, size_t size)
+{
+    return _calloc(nmemb, size);
+}
+
+NS_EXPORT_(__ptr_t) realloc(__ptr_t ptr, size_t size)
+{
+    return _realloc(ptr, size);
+}
+
+NS_EXPORT_(void) free(__ptr_t ptr)
+{
+    _free(ptr);
+}
+
+NS_EXPORT_(void) cfree(__ptr_t ptr)
+{
+    _free(ptr);
+}
+
+NS_EXPORT_(__ptr_t) memalign(size_t boundary, size_t size)
+{
+    return _memalign(boundary, size);
+}
+
+NS_EXPORT_(int)
+posix_memalign(void **memptr, size_t alignment, size_t size)
+{
+    __ptr_t ptr = _memalign(alignment, size);
+    if (!ptr)
+        return ENOMEM;
+    *memptr = ptr;
+    return 0;
+}
+
+NS_EXPORT_(__ptr_t) valloc(size_t size)
+{
+    return _valloc(size);
+}
+#endif /* NS_TRACE_MALLOC */
+
 struct DependentLib
 {
     void         *libHandle;
     DependentLib *next;
 };
 
 static DependentLib *sTop;
 static void* sXULLibHandle;
@@ -92,16 +157,25 @@ XPCOMGlueLoad(const char *xpcomFile, Get
         if (lastSlash) {
             *lastSlash = '\0';
 
             XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB);
 
             snprintf(lastSlash, MAXPATHLEN - strlen(xpcomDir), "/" XUL_DLL);
 
             sXULLibHandle = dlopen(xpcomDir, RTLD_GLOBAL | RTLD_LAZY);
+
+#ifdef NS_TRACE_MALLOC
+            _malloc = (__ptr_t(*)(size_t)) dlsym(sXULLibHandle, "malloc");
+            _calloc = (__ptr_t(*)(size_t, size_t)) dlsym(sXULLibHandle, "calloc");
+            _realloc = (__ptr_t(*)(__ptr_t, size_t)) dlsym(sXULLibHandle, "realloc");
+            _free = (void(*)(__ptr_t)) dlsym(sXULLibHandle, "free");
+            _memalign = (__ptr_t(*)(size_t, size_t)) dlsym(sXULLibHandle, "memalign");
+            _valloc = (__ptr_t(*)(size_t)) dlsym(sXULLibHandle, "valloc");
+#endif
         }
     }
 
     // RTLD_DEFAULT is not defined in non-GNU toolchains, and it is
     // (void*) 0 in any case.
 
     void *libHandle = nsnull;
 
@@ -134,16 +208,24 @@ XPCOMGlueUnload()
 
         DependentLib *temp = sTop;
         sTop = sTop->next;
 
         delete temp;
     }
 
     if (sXULLibHandle) {
+#ifdef NS_TRACE_MALLOC
+        _malloc = __libc_malloc;
+        _calloc = __libc_calloc;
+        _realloc = __libc_realloc;
+        _free = __libc_free;
+        _memalign = __libc_memalign;
+        _valloc = __libc_valloc;
+#endif
         dlclose(sXULLibHandle);
         sXULLibHandle = nsnull;
     }
 }
 
 nsresult
 XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad *symbols)
 {