diff options
Diffstat (limited to 'memory/build/mozmemory.h')
-rw-r--r-- | memory/build/mozmemory.h | 91 |
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 */ |