summaryrefslogtreecommitdiffstats
path: root/memory/build/mozmemory_wrap.h
diff options
context:
space:
mode:
Diffstat (limited to 'memory/build/mozmemory_wrap.h')
-rw-r--r--memory/build/mozmemory_wrap.h219
1 files changed, 219 insertions, 0 deletions
diff --git a/memory/build/mozmemory_wrap.h b/memory/build/mozmemory_wrap.h
new file mode 100644
index 000000000..066d57782
--- /dev/null
+++ b/memory/build/mozmemory_wrap.h
@@ -0,0 +1,219 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozmemory_wrap_h
+#define mozmemory_wrap_h
+
+/*
+ * This header contains #defines which tweak the names of various memory
+ * allocation functions.
+ *
+ * There are several types of functions related to memory allocation
+ * that are meant to be used publicly by the Gecko codebase:
+ *
+ * - malloc implementation functions:
+ * - malloc
+ * - posix_memalign
+ * - aligned_alloc
+ * - calloc
+ * - realloc
+ * - free
+ * - memalign
+ * - valloc
+ * - malloc_usable_size
+ * - malloc_good_size
+ * Some of these functions are specific to some systems, but for
+ * convenience, they are treated as being cross-platform, and available
+ * as such.
+ *
+ * - duplication functions:
+ * - strndup
+ * - strdup
+ * - wcsdup (Windows only)
+ *
+ * - jemalloc specific functions:
+ * - jemalloc_stats
+ * - jemalloc_purge_freed_pages
+ * - jemalloc_free_dirty_pages
+ * (these functions are native to mozjemalloc, and have compatibility
+ * implementations for jemalloc3)
+ *
+ * These functions are all exported as part of libmozglue (see
+ * $(topsrcdir)/mozglue/build/Makefile.in), with a few implementation
+ * peculiarities:
+ *
+ * - On Windows, the malloc implementation functions are all prefixed with
+ * "je_", the duplication functions are prefixed with "wrap_", and jemalloc
+ * specific functions are left unprefixed. All these functions are however
+ * aliased when exporting them, such that the resulting mozglue.dll exports
+ * them unprefixed (see $(topsrcdir)/mozglue/build/mozglue.def.in). The
+ * prefixed malloc implementation and duplication functions are not
+ * exported.
+ *
+ * - On MacOSX, the system libc has a zone allocator, which allows us to
+ * hook custom malloc implementation functions without exporting them.
+ * The malloc implementation functions are all prefixed with "je_" and used
+ * this way from the custom zone allocator. They are not exported.
+ * Duplication functions are not included, since they will call the custom
+ * zone allocator anyways. Jemalloc-specific functions are also left
+ * unprefixed.
+ *
+ * - On Android and Gonk, all functions are left unprefixed. Additionally,
+ * C++ allocation functions (operator new/delete) are also exported and
+ * unprefixed.
+ *
+ * - On other systems (mostly Linux), all functions are left unprefixed.
+ *
+ * Only Android and Gonk add C++ allocation functions.
+ *
+ * Proper exporting of the various functions is done with the MOZ_MEMORY_API
+ * and MOZ_JEMALLOC_API macros. MOZ_MEMORY_API is meant to be used for malloc
+ * implementation and duplication functions, while MOZ_JEMALLOC_API is
+ * dedicated to jemalloc specific functions.
+ *
+ *
+ * All these functions are meant to be called with no prefix from Gecko code.
+ * In most cases, this is because that's how they are available at runtime.
+ * However, on Android, this relies on faulty.lib (the custom dynamic linker)
+ * resolving mozglue symbols before libc symbols, which is guaranteed by the
+ * way faulty.lib works (it respects the DT_NEEDED order, and libc always
+ * appears after mozglue ; which we double check when building anyways)
+ *
+ *
+ * Within libmozglue (when MOZ_MEMORY_IMPL is defined), all the functions
+ * should be suffixed with "_impl" both for declarations and use.
+ * That is, the implementation declaration for e.g. strdup would look like:
+ * char* strdup_impl(const char *)
+ * That implementation would call malloc by using "malloc_impl".
+ *
+ * While mozjemalloc uses these "_impl" suffixed helpers, jemalloc3, being
+ * third-party code, doesn't, but instead has an elaborate way to mangle
+ * individual functions. See under "Run jemalloc configure script" in
+ * $(topsrcdir)/configure.in.
+ *
+ *
+ * When building with replace-malloc support, the above still holds, but
+ * the malloc implementation and jemalloc specific functions are the
+ * replace-malloc functions from replace_malloc.c.
+ *
+ * The actual jemalloc/mozjemalloc implementation is prefixed with "je_".
+ *
+ * Thus, when MOZ_REPLACE_MALLOC is defined, the "_impl" suffixed macros
+ * expand to "je_" prefixed function when building mozjemalloc or
+ * jemalloc3/mozjemalloc_compat, where MOZ_JEMALLOC_IMPL is defined.
+ *
+ * In other cases, the "_impl" suffixed macros follow the original scheme,
+ * except on Windows and MacOSX, where they would expand to "je_" prefixed
+ * functions. Instead, they are left unmodified (malloc_impl expands to
+ * malloc_impl).
+ */
+
+#ifndef MOZ_MEMORY
+# error Should only include mozmemory_wrap.h when MOZ_MEMORY is set.
+#endif
+
+#if defined(MOZ_JEMALLOC_IMPL) && !defined(MOZ_MEMORY_IMPL)
+# define MOZ_MEMORY_IMPL
+#endif
+#if defined(MOZ_MEMORY_IMPL) && !defined(IMPL_MFBT)
+# ifdef MFBT_API /* mozilla/Types.h was already included */
+# error mozmemory_wrap.h has to be included before mozilla/Types.h when MOZ_MEMORY_IMPL is set and IMPL_MFBT is not.
+# endif
+# define IMPL_MFBT
+#endif
+
+#include "mozilla/Types.h"
+
+#if !defined(MOZ_SYSTEM_JEMALLOC)
+# ifdef MOZ_MEMORY_IMPL
+# if defined(MOZ_JEMALLOC_IMPL) && defined(MOZ_REPLACE_MALLOC) && !defined(MOZ_REPLACE_JEMALLOC)
+# define mozmem_malloc_impl(a) je_ ## a
+# define mozmem_jemalloc_impl(a) je_ ## a
+# else
+# define MOZ_JEMALLOC_API MFBT_API
+# ifdef MOZ_REPLACE_JEMALLOC
+# define MOZ_MEMORY_API MFBT_API
+# define mozmem_malloc_impl(a) replace_ ## a
+# define mozmem_jemalloc_impl(a) replace_ ## a
+# elif (defined(XP_WIN) || defined(XP_DARWIN))
+# if defined(MOZ_REPLACE_MALLOC)
+# define mozmem_malloc_impl(a) a ## _impl
+# else
+# define mozmem_malloc_impl(a) je_ ## a
+# endif
+# else
+# define MOZ_MEMORY_API MFBT_API
+# if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
+# define MOZ_WRAP_NEW_DELETE
+# endif
+# endif
+# endif
+# ifdef XP_WIN
+# define mozmem_dup_impl(a) wrap_ ## a
+# endif
+# endif
+
+/* All other jemalloc3 functions are prefixed with "je_", except when
+ * building against an unprefixed system jemalloc library */
+# define je_(a) je_ ## a
+#else /* defined(MOZ_SYSTEM_JEMALLOC) */
+# define je_(a) a
+#endif
+
+#if !defined(MOZ_MEMORY_IMPL) || defined(MOZ_SYSTEM_JEMALLOC)
+# define MOZ_MEMORY_API MFBT_API
+# define MOZ_JEMALLOC_API MFBT_API
+#endif
+
+#ifndef MOZ_MEMORY_API
+# define MOZ_MEMORY_API
+#endif
+#ifndef MOZ_JEMALLOC_API
+# define MOZ_JEMALLOC_API
+#endif
+
+#ifndef mozmem_malloc_impl
+# define mozmem_malloc_impl(a) a
+#endif
+#ifndef mozmem_dup_impl
+# define mozmem_dup_impl(a) a
+#endif
+#ifndef mozmem_jemalloc_impl
+# define mozmem_jemalloc_impl(a) a
+#endif
+
+/* Malloc implementation functions */
+#define malloc_impl mozmem_malloc_impl(malloc)
+#define posix_memalign_impl mozmem_malloc_impl(posix_memalign)
+#define aligned_alloc_impl mozmem_malloc_impl(aligned_alloc)
+#define calloc_impl mozmem_malloc_impl(calloc)
+#define realloc_impl mozmem_malloc_impl(realloc)
+#define free_impl mozmem_malloc_impl(free)
+#define memalign_impl mozmem_malloc_impl(memalign)
+#define valloc_impl mozmem_malloc_impl(valloc)
+#define malloc_usable_size_impl mozmem_malloc_impl(malloc_usable_size)
+#define malloc_good_size_impl mozmem_malloc_impl(malloc_good_size)
+
+/* Duplication functions */
+#define strndup_impl mozmem_dup_impl(strndup)
+#define strdup_impl mozmem_dup_impl(strdup)
+#ifdef XP_WIN
+# define wcsdup_impl mozmem_dup_impl(wcsdup)
+#endif
+
+/* String functions */
+#ifdef ANDROID
+/* Bug 801571 and Bug 879668, libstagefright uses vasprintf, causing malloc()/
+ * free() to be mismatched between bionic and mozglue implementation.
+ */
+#define vasprintf_impl mozmem_dup_impl(vasprintf)
+#define asprintf_impl mozmem_dup_impl(asprintf)
+#endif
+
+/* Jemalloc specific function */
+#define jemalloc_stats_impl mozmem_jemalloc_impl(jemalloc_stats)
+#define jemalloc_purge_freed_pages_impl mozmem_jemalloc_impl(jemalloc_purge_freed_pages)
+#define jemalloc_free_dirty_pages_impl mozmem_jemalloc_impl(jemalloc_free_dirty_pages)
+
+#endif /* mozmemory_wrap_h */