summaryrefslogtreecommitdiffstats
path: root/memory/build/mozmemory.h
diff options
context:
space:
mode:
Diffstat (limited to 'memory/build/mozmemory.h')
-rw-r--r--memory/build/mozmemory.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/memory/build/mozmemory.h b/memory/build/mozmemory.h
new file mode 100644
index 000000000..84007fffb
--- /dev/null
+++ b/memory/build/mozmemory.h
@@ -0,0 +1,91 @@
+/* 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_h
+#define mozmemory_h
+
+/*
+ * This header is meant to be used when the following functions are
+ * necessary:
+ * - malloc_good_size (used to be called je_malloc_usable_in_advance)
+ * - jemalloc_stats
+ * - jemalloc_purge_freed_pages
+ * - jemalloc_free_dirty_pages
+ */
+
+#ifndef MOZ_MEMORY
+# error Should not include mozmemory.h when MOZ_MEMORY is not set
+#endif
+
+#include "mozmemory_wrap.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/Types.h"
+#include "jemalloc_types.h"
+
+MOZ_BEGIN_EXTERN_C
+
+/*
+ * On OSX, malloc/malloc.h contains the declaration for malloc_good_size,
+ * which will call back in jemalloc, through the zone allocator so just use it.
+ */
+#ifdef XP_DARWIN
+# include <malloc/malloc.h>
+#else
+MOZ_MEMORY_API size_t malloc_good_size_impl(size_t size);
+
+/* Note: the MOZ_GLUE_IN_PROGRAM ifdef below is there to avoid -Werror turning
+ * the protective if into errors. MOZ_GLUE_IN_PROGRAM is what triggers MFBT_API
+ * to use weak imports. */
+
+static inline size_t _malloc_good_size(size_t size) {
+# if defined(MOZ_GLUE_IN_PROGRAM) && !defined(IMPL_MFBT)
+ if (!malloc_good_size)
+ return size;
+# endif
+ return malloc_good_size_impl(size);
+}
+
+# define malloc_good_size _malloc_good_size
+#endif
+
+MOZ_JEMALLOC_API void jemalloc_stats(jemalloc_stats_t *stats);
+
+/*
+ * On some operating systems (Mac), we use madvise(MADV_FREE) to hand pages
+ * back to the operating system. On Mac, the operating system doesn't take
+ * this memory back immediately; instead, the OS takes it back only when the
+ * machine is running out of physical memory.
+ *
+ * This is great from the standpoint of efficiency, but it makes measuring our
+ * actual RSS difficult, because pages which we've MADV_FREE'd shouldn't count
+ * against our RSS.
+ *
+ * This function explicitly purges any MADV_FREE'd pages from physical memory,
+ * causing our reported RSS match the amount of memory we're actually using.
+ *
+ * Note that this call is expensive in two ways. First, it may be slow to
+ * execute, because it may make a number of slow syscalls to free memory. This
+ * function holds the big jemalloc locks, so basically all threads are blocked
+ * while this function runs.
+ *
+ * This function is also expensive in that the next time we go to access a page
+ * which we've just explicitly decommitted, the operating system has to attach
+ * to it a physical page! If we hadn't run this function, the OS would have
+ * less work to do.
+ *
+ * If MALLOC_DOUBLE_PURGE is not defined, this function does nothing.
+ */
+MOZ_JEMALLOC_API void jemalloc_purge_freed_pages();
+
+/*
+ * Free all unused dirty pages in all arenas. Calling this function will slow
+ * down subsequent allocations so it is recommended to use it only when
+ * memory needs to be reclaimed at all costs (see bug 805855). This function
+ * provides functionality similar to mallctl("arenas.purge") in jemalloc 3.
+ */
+MOZ_JEMALLOC_API void jemalloc_free_dirty_pages();
+
+MOZ_END_EXTERN_C
+
+#endif /* mozmemory_h */