Bug 658995 part 1 - Properly divert memory allocation functions for trace malloc with standalone glue on Linux. r=dbaron
☠☠ backed out by d612f355a028 ☠ ☠
authorMike Hommey <mh+mozilla@glandium.org>
Wed, 15 Jun 2011 07:30:44 +0200
changeset 71061 6b23b52e68d654a42a6da120a15bffcf96eea051
parent 71060 bf50cdd9ba999bba03f1fcf9da1cdbea440f07d3
child 71062 6e230988614fb99eb6967d6e24c7b7daad01b68c
push id68
push usermh@glandium.org
push dateWed, 15 Jun 2011 05:41:24 +0000
treeherdermozilla-inbound@e92f98e8a335 [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,78 @@
  * 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 <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_(__ptr_t) memalign(size_t boundary, size_t size)
+{
+    return _memalign(boundary, size);
+}
+
+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 +141,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 +192,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)
 {