Home | History | Annotate | Download | only in jemalloc
      1 //
      2 // Copyright (C) 2014 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 common_cflags = [
     18     "-D_REENTRANT",
     19     "-O3",
     20     "-funroll-loops",
     21     "-fvisibility=hidden",
     22     "-Werror",
     23     "-Wno-unused-parameter",
     24     "-Wno-type-limits",
     25 ]
     26 
     27 // These parameters change the way jemalloc works.
     28 //   ANDROID_MAX_ARENAS=XX
     29 //     The total number of arenas will be less than or equal to this number.
     30 //     The number of arenas will be calculated as 2 * the number of cpus
     31 //     but no larger than XX.
     32 //   ANDROID_TCACHE_NSLOTS_SMALL_MAX=XX
     33 //     The number of small slots held in the tcache. The higher this number
     34 //     is, the higher amount of PSS consumed. If this number is set too low
     35 //     then small allocations will take longer to complete.
     36 //   ANDROID_TCACHE_NSLOTS_LARGE=XX
     37 //     The number of large slots held in the tcache. The higher this number
     38 //     is, the higher amount of PSS consumed. If this number is set too low
     39 //     then large allocations will take longer to complete.
     40 //   ANDROID_LG_TCACHE_MAXCLASS_DEFAULT=XX
     41 //     1 << XX is the maximum sized allocation that will be in the tcache.
     42 //   ANDROID_LG_CHUNK_DEFAULT=XX
     43 //     1 << XX is the default chunk size used by the system. Decreasing this
     44 //     usually decreases the amount of PSS used, but can increase
     45 //     fragmentation.
     46 
     47 android_common_cflags = [
     48     // Default to a single arena for svelte configurations to minimize
     49     // PSS. This will be overridden by android_product_variables for
     50     // non-svelte configs.
     51     "-DANDROID_MAX_ARENAS=1",
     52     "-DANDROID_LG_TCACHE_MAXCLASS_DEFAULT=16",
     53 ]
     54 
     55 common_c_local_includes = [
     56     "src",
     57     "include",
     58 ]
     59 
     60 android_product_variables = {
     61     // Only enable the tcache on non-svelte configurations, to save PSS.
     62     malloc_not_svelte: {
     63         cflags: [
     64             "-UANDROID_MAX_ARENAS",
     65             "-DANDROID_MAX_ARENAS=2",
     66             "-DJEMALLOC_TCACHE",
     67             "-DANDROID_TCACHE_NSLOTS_SMALL_MAX=8",
     68             "-DANDROID_TCACHE_NSLOTS_LARGE=16",
     69         ],
     70     },
     71 }
     72 
     73 cc_defaults {
     74     name: "jemalloc_defaults",
     75     defaults: ["linux_bionic_supported"],
     76     host_supported: true,
     77     cflags: common_cflags,
     78 
     79     target: {
     80         android: {
     81             cflags: android_common_cflags + [
     82                 "-include android/include/log.h",
     83             ],
     84             product_variables: android_product_variables,
     85         },
     86         linux_bionic: {
     87             cflags: ["-DJEMALLOC_TCACHE"],
     88         },
     89         linux_glibc: {
     90             enabled: true,
     91         },
     92     },
     93 
     94     multilib: {
     95         lib32: {
     96             // Use a 512K chunk size on 32 bit systems.
     97             // This keeps the total amount of virtual address space consumed
     98             // by jemalloc lower.
     99             cflags: [
    100                 "-DANDROID_LG_CHUNK_DEFAULT=19",
    101             ],
    102         },
    103         lib64: {
    104             // Use a 2MB chunk size on 64 bit systems.
    105             // This is the default currently used by 4.0.0
    106             cflags: [
    107                 "-DANDROID_LG_CHUNK_DEFAULT=21",
    108             ],
    109         },
    110     },
    111 
    112     local_include_dirs: common_c_local_includes,
    113     stl: "none",
    114 }
    115 
    116 lib_src_files = [
    117     "src/arena.c",
    118     "src/atomic.c",
    119     "src/base.c",
    120     "src/bitmap.c",
    121     "src/chunk.c",
    122     "src/chunk_dss.c",
    123     "src/chunk_mmap.c",
    124     "src/ckh.c",
    125     "src/ctl.c",
    126     "src/extent.c",
    127     "src/hash.c",
    128     "src/huge.c",
    129     "src/jemalloc.c",
    130     "src/mb.c",
    131     "src/mutex.c",
    132     "src/nstime.c",
    133     "src/pages.c",
    134     "src/prng.c",
    135     "src/prof.c",
    136     "src/quarantine.c",
    137     "src/rtree.c",
    138     "src/spin.c",
    139     "src/stats.c",
    140     "src/tcache.c",
    141     "src/ticker.c",
    142     "src/tsd.c",
    143     "src/util.c",
    144     "src/witness.c",
    145 ]
    146 
    147 //-----------------------------------------------------------------------
    148 // jemalloc static library
    149 //-----------------------------------------------------------------------
    150 cc_library {
    151     name: "libjemalloc",
    152     recovery_available: true,
    153 
    154     defaults: ["jemalloc_defaults"],
    155 
    156     target: {
    157         android: {
    158             shared: {
    159                 enabled: false,
    160             },
    161         },
    162     },
    163 
    164     srcs: lib_src_files,
    165 }
    166 
    167 //-----------------------------------------------------------------------
    168 // jemalloc static jet library
    169 //-----------------------------------------------------------------------
    170 cc_library_static {
    171     name: "libjemalloc_jet",
    172 
    173     defaults: ["jemalloc_defaults"],
    174 
    175     cflags: [
    176         "-DJEMALLOC_JET",
    177     ],
    178 
    179     srcs: lib_src_files,
    180 
    181 }
    182 
    183 jemalloc_testlib_srcs = [
    184     "test/src/btalloc.c",
    185     "test/src/btalloc_0.c",
    186     "test/src/btalloc_1.c",
    187     "test/src/math.c",
    188     "test/src/mq.c",
    189     "test/src/mtx.c",
    190     "test/src/SFMT.c",
    191     "test/src/test.c",
    192     "test/src/thd.c",
    193     "test/src/timer.c",
    194 ]
    195 
    196 //-----------------------------------------------------------------------
    197 // jemalloc unit test library
    198 //-----------------------------------------------------------------------
    199 cc_library_static {
    200     name: "libjemalloc_unittest",
    201 
    202     defaults: ["jemalloc_defaults"],
    203     cflags: [
    204         "-DJEMALLOC_UNIT_TEST",
    205     ],
    206 
    207     local_include_dirs: [
    208         "test/src",
    209         "test/include",
    210     ],
    211 
    212     srcs: jemalloc_testlib_srcs,
    213 
    214     whole_static_libs: ["libjemalloc_jet"],
    215 }
    216 
    217 //-----------------------------------------------------------------------
    218 // jemalloc unit tests
    219 //-----------------------------------------------------------------------
    220 unit_tests = [
    221     "test/unit/a0.c",
    222     "test/unit/arena_reset.c",
    223     "test/unit/atomic.c",
    224     "test/unit/bitmap.c",
    225     "test/unit/ckh.c",
    226     "test/unit/decay.c",
    227     "test/unit/fork.c",
    228     "test/unit/hash.c",
    229     "test/unit/junk.c",
    230     "test/unit/junk_alloc.c",
    231     "test/unit/junk_free.c",
    232     "test/unit/lg_chunk.c",
    233     "test/unit/mallctl.c",
    234     "test/unit/math.c",
    235     "test/unit/mq.c",
    236     "test/unit/mtx.c",
    237     "test/unit/nstime.c",
    238     "test/unit/pack.c",
    239     "test/unit/pages.c",
    240     "test/unit/prng.c",
    241     "test/unit/prof_accum.c",
    242     "test/unit/prof_active.c",
    243     "test/unit/prof_gdump.c",
    244     "test/unit/prof_idump.c",
    245     "test/unit/prof_reset.c",
    246     "test/unit/prof_thread_name.c",
    247     "test/unit/ql.c",
    248     "test/unit/qr.c",
    249     "test/unit/quarantine.c",
    250     "test/unit/rb.c",
    251     "test/unit/rtree.c",
    252     "test/unit/run_quantize.c",
    253     "test/unit/SFMT.c",
    254     "test/unit/size_classes.c",
    255     "test/unit/smoothstep.c",
    256     "test/unit/stats.c",
    257     "test/unit/ticker.c",
    258     "test/unit/tsd.c",
    259     "test/unit/util.c",
    260     "test/unit/witness.c",
    261     "test/unit/zero.c",
    262 ]
    263 
    264 cc_test {
    265     name: "jemalloc_unittests",
    266 
    267     defaults: ["jemalloc_defaults"],
    268 
    269     gtest: false,
    270 
    271     cflags: common_cflags + [
    272         "-DJEMALLOC_UNIT_TEST",
    273     ],
    274 
    275     local_include_dirs: common_c_local_includes + [
    276         "test/src",
    277         "test/include",
    278     ],
    279 
    280     srcs: unit_tests,
    281 
    282     static_libs: ["libjemalloc_unittest"],
    283 
    284     shared_libs: ["liblog"],
    285 
    286     test_per_src: true,
    287 
    288     target: {
    289         linux_glibc: {
    290             // The sanitizer does not work for these tests on the host.
    291             sanitize: {
    292                 never: true,
    293             },
    294         },
    295     },
    296 }
    297 
    298 //-----------------------------------------------------------------------
    299 // jemalloc integration test library
    300 //-----------------------------------------------------------------------
    301 cc_library_static {
    302     name: "libjemalloc_integrationtest",
    303 
    304     defaults: ["jemalloc_defaults"],
    305 
    306     cflags: [
    307         "-DJEMALLOC_INTEGRATION_TEST",
    308     ],
    309 
    310     local_include_dirs: [
    311         "test/src",
    312         "test/include",
    313     ],
    314 
    315     srcs: jemalloc_testlib_srcs + lib_src_files,
    316 
    317 }
    318 
    319 //-----------------------------------------------------------------------
    320 // jemalloc integration tests
    321 //-----------------------------------------------------------------------
    322 integration_tests = [
    323     "test/integration/aligned_alloc.c",
    324     "test/integration/allocated.c",
    325     "test/integration/chunk.c",
    326     "test/integration/MALLOCX_ARENA.c",
    327     "test/integration/mallocx.c",
    328     "test/integration/overflow.c",
    329     "test/integration/posix_memalign.c",
    330     "test/integration/rallocx.c",
    331     "test/integration/sdallocx.c",
    332     "test/integration/thread_arena.c",
    333     "test/integration/thread_tcache_enabled.c",
    334     "test/integration/xallocx.c",
    335 ]
    336 
    337 android_integration_tests = [
    338     "test/integration/iterate.c",
    339 ]
    340 
    341 cc_test {
    342     name: "jemalloc_integrationtests",
    343 
    344     defaults: ["jemalloc_defaults"],
    345 
    346     gtest: false,
    347 
    348     cflags: common_cflags + [
    349         "-DJEMALLOC_INTEGRATION_TEST",
    350     ],
    351 
    352     local_include_dirs: common_c_local_includes + [
    353         "test/src",
    354         "test/include",
    355     ],
    356 
    357     srcs: integration_tests,
    358     target: {
    359         android: {
    360             srcs: android_integration_tests,
    361         },
    362         linux_glibc: {
    363             // The sanitizer does not work for these tests on the host.
    364             sanitize: {
    365                 never: true,
    366             },
    367         },
    368     },
    369 
    370     static_libs: ["libjemalloc_integrationtest"],
    371 
    372     shared_libs: ["liblog"],
    373 
    374     test_per_src: true,
    375 }
    376