tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mozmemory_wrap.h (6077B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef mozmemory_wrap_h
      8 #define mozmemory_wrap_h
      9 
     10 // This header contains #defines which tweak the names of various memory
     11 // allocation functions.
     12 //
     13 // There are several types of functions related to memory allocation
     14 // that are meant to be used publicly by the Gecko codebase:
     15 //
     16 // - malloc implementation functions:
     17 //   - malloc
     18 //   - posix_memalign
     19 //   - aligned_alloc
     20 //   - calloc
     21 //   - realloc
     22 //   - free
     23 //   - memalign
     24 //   - valloc
     25 //   - malloc_usable_size
     26 //   - malloc_good_size
     27 //   Some of these functions are specific to some systems, but for
     28 //   convenience, they are treated as being cross-platform, and available
     29 //   as such.
     30 //
     31 // - duplication functions:
     32 //   - strndup
     33 //   - strdup
     34 //   - wcsdup (Windows only)
     35 //
     36 // - jemalloc specific functions:
     37 //   - jemalloc_stats
     38 //   - jemalloc_stats_num_bins
     39 //   - jemalloc_purge_freed_pages
     40 //   - jemalloc_free_dirty_pages
     41 //   - jemalloc_thread_local_arena
     42 //   - jemalloc_ptr_info
     43 //   (these functions are native to mozjemalloc)
     44 //
     45 // These functions are all exported as part of libmozglue (see
     46 // $(topsrcdir)/mozglue/build/Makefile.in), with a few implementation
     47 // peculiarities:
     48 //
     49 // - On Windows, the malloc implementation functions are all prefixed with
     50 //   "je_", the duplication functions are prefixed with "wrap_", and jemalloc
     51 //   specific functions are left unprefixed. All these functions are however
     52 //   aliased when exporting them, such that the resulting mozglue.dll exports
     53 //   them unprefixed (see $(topsrcdir)/mozglue/build/mozglue.def.in). The
     54 //   prefixed malloc implementation and duplication functions are not
     55 //   exported.
     56 //
     57 // - On MacOSX, the system libc has a zone allocator, which allows us to
     58 //   hook custom malloc implementation functions without exporting them.
     59 //   However, since we want things in Firefox to skip the system zone
     60 //   allocator, the malloc implementation functions are all exported
     61 //   unprefixed, as well as duplication functions.
     62 //   Jemalloc-specific functions are also left unprefixed.
     63 //
     64 // - On Android all functions are left unprefixed.
     65 //
     66 // - On other systems (mostly Linux), all functions are left unprefixed.
     67 //
     68 // On all platforms, C++ allocation functions are also exported.
     69 //
     70 // Proper exporting of the various functions is done with the MOZ_MEMORY_API
     71 // and MOZ_JEMALLOC_API macros. MOZ_MEMORY_API is meant to be used for malloc
     72 // implementation and duplication functions, while MOZ_JEMALLOC_API is
     73 // dedicated to jemalloc specific functions.
     74 //
     75 //
     76 // All these functions are meant to be called with no prefix from Gecko code.
     77 // In most cases, this is because that's how they are available at runtime.
     78 // However, on Android, this relies on faulty.lib (the custom dynamic linker)
     79 // resolving mozglue symbols before libc symbols, which is guaranteed by the
     80 // way faulty.lib works (it respects the DT_NEEDED order, and libc always
     81 // appears after mozglue ; which we double check when building anyways)
     82 //
     83 //
     84 // Within libmozglue (when MOZ_MEMORY_IMPL is defined), all the functions
     85 // should be suffixed with "_impl" both for declarations and use.
     86 // That is, the implementation declaration for e.g. strdup would look like:
     87 //   char* strdup_impl(const char *)
     88 // That implementation would call malloc by using "malloc_impl".
     89 
     90 #if defined(MOZ_MEMORY_IMPL) && !defined(IMPL_MFBT)
     91 #  ifdef MFBT_API  // mozilla/Types.h was already included
     92 #    error mozmemory_wrap.h has to be included before mozilla/Types.h when MOZ_MEMORY_IMPL is set and IMPL_MFBT is not.
     93 #  endif
     94 #  define IMPL_MFBT
     95 #endif
     96 
     97 #include "mozilla/Types.h"
     98 
     99 #ifndef MOZ_EXTERN_C
    100 #  ifdef __cplusplus
    101 #    define MOZ_EXTERN_C extern "C"
    102 #  else
    103 #    define MOZ_EXTERN_C
    104 #  endif
    105 #endif
    106 
    107 #ifdef MOZ_MEMORY_IMPL
    108 #  define MOZ_JEMALLOC_API MOZ_EXTERN_C MFBT_API
    109 #  define MOZ_JEMALLOC_API_NODISCARD MOZ_EXTERN_C [[nodiscard]] MFBT_API
    110 #  if defined(XP_WIN)
    111 #    define mozmem_malloc_impl(a) je_##a
    112 #  else
    113 #    define MOZ_MEMORY_API MOZ_EXTERN_C MFBT_API
    114 #  endif
    115 #endif
    116 #ifdef XP_WIN
    117 #  define mozmem_dup_impl(a) wrap_##a
    118 #endif
    119 
    120 #if !defined(MOZ_MEMORY_IMPL)
    121 #  define MOZ_MEMORY_API MOZ_EXTERN_C MFBT_API
    122 #  define MOZ_JEMALLOC_API MOZ_EXTERN_C MFBT_API
    123 #  define MOZ_JEMALLOC_API_NODISCARD MOZ_EXTERN_C [[nodiscard]] MFBT_API
    124 #endif
    125 
    126 #ifndef MOZ_MEMORY_API
    127 #  define MOZ_MEMORY_API MOZ_EXTERN_C
    128 #endif
    129 #ifndef MOZ_JEMALLOC_API
    130 #  define MOZ_JEMALLOC_API MOZ_EXTERN_C
    131 #  define MOZ_JEMALLOC_API_NODISCARD MOZ_EXTERN_C [[nodiscard]]
    132 #endif
    133 
    134 #ifndef mozmem_malloc_impl
    135 #  define mozmem_malloc_impl(a) a
    136 #endif
    137 #ifndef mozmem_dup_impl
    138 #  define mozmem_dup_impl(a) a
    139 #endif
    140 
    141 // Malloc implementation functions
    142 #define malloc_impl mozmem_malloc_impl(malloc)
    143 #define posix_memalign_impl mozmem_malloc_impl(posix_memalign)
    144 #define aligned_alloc_impl mozmem_malloc_impl(aligned_alloc)
    145 #define calloc_impl mozmem_malloc_impl(calloc)
    146 #define realloc_impl mozmem_malloc_impl(realloc)
    147 #define free_impl mozmem_malloc_impl(free)
    148 #define memalign_impl mozmem_malloc_impl(memalign)
    149 #define valloc_impl mozmem_malloc_impl(valloc)
    150 #define malloc_usable_size_impl mozmem_malloc_impl(malloc_usable_size)
    151 #define malloc_good_size_impl mozmem_malloc_impl(malloc_good_size)
    152 
    153 // Duplication functions
    154 #define strndup_impl mozmem_dup_impl(strndup)
    155 #define strdup_impl mozmem_dup_impl(strdup)
    156 #ifdef XP_WIN
    157 #  define wcsdup_impl mozmem_dup_impl(wcsdup)
    158 #  define _aligned_malloc_impl mozmem_dup_impl(_aligned_malloc)
    159 #endif
    160 
    161 // String functions
    162 #ifdef ANDROID
    163 // Bug 801571 and Bug 879668, libstagefright uses vasprintf, causing malloc()/
    164 // free() to be mismatched between bionic and mozglue implementation.
    165 #  define vasprintf_impl mozmem_dup_impl(vasprintf)
    166 #  define asprintf_impl mozmem_dup_impl(asprintf)
    167 #endif
    168 
    169 #endif  // mozmemory_wrap_h