author | Mike Hommey <mh+mozilla@glandium.org> |
Wed, 15 Jun 2011 07:30:44 +0200 | |
changeset 71200 | eef5d644e17e778357ab31306136dc88fc52413c |
parent 71199 | f81579f78f92cc0be591fad1087d37ca5d388efe |
child 71201 | f4ddad2c0eb7d079abeba227758176ba4992f59e |
push id | 101 |
push user | mh@glandium.org |
push date | Fri, 17 Jun 2011 01:05:08 +0000 |
treeherder | mozilla-inbound@cc18551d5cc3 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | dbaron |
bugs | 658995 |
milestone | 7.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
|
--- 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) {