// // Copyright (C) 2018 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package { default_applicable_licenses: ["external_jemalloc_new_license"], } // Added automatically by a large-scale-change that took the approach of // 'apply every license found to every target'. While this makes sure we respect // every license restriction, it may not be entirely correct. // // e.g. GPL in an MIT project might only apply to the contrib/ directory. // // Please consider splitting the single license below into multiple licenses, // taking care not to lose any license_kind information, and overriding the // default license using the 'licenses: [...]' property on targets as needed. // // For unused files, consider creating a 'fileGroup' with "//visibility:private" // to attach the license to, and including a comment whether the files may be // used in the current project. // See: http://go/android-license-faq license { name: "external_jemalloc_new_license", visibility: [":__subpackages__"], license_kinds: [ "SPDX-license-identifier-Apache-2.0", "SPDX-license-identifier-BSD", "SPDX-license-identifier-ISC", "SPDX-license-identifier-MIT", "legacy_unencumbered", ], license_text: [ "COPYING", ], } common_cflags = [ "-D_GNU_SOURCE", "-D_REENTRANT", "-Wall", "-Wshorten-64-to-32", "-Wsign-compare", "-Wundef", "-Wno-format-zero-length", "-pipe", "-g3", "-fvisibility=hidden", "-O3", "-funroll-loops", // The following flags are for avoiding errors when compiling. "-Wno-unused-parameter", "-Wno-unused-function", "-Wno-missing-field-initializers", "-U_FORTIFY_SOURCE", ] common_c_local_includes = [ "src", "include", ] // These parameters change the way jemalloc works. // ANDROID_NUM_ARENAS=XX // The total number of arenas to create. // ANDROID_TCACHE_NSLOTS_SMALL_MIN=XX // The minimum number of small slots held in the tcache. This must be // at least 1. // ANDROID_TCACHE_NSLOTS_SMALL_MAX=XX // The number of small slots held in the tcache. The higher this number // is, the higher amount of PSS consumed. If this number is set too low // then small allocations will take longer to complete. // ANDROID_TCACHE_NSLOTS_LARGE=XX // The number of large slots held in the tcache. The higher this number // is, the higher amount of PSS consumed. If this number is set too low // then large allocations will take longer to complete. // ANDROID_LG_TCACHE_MAXCLASS_DEFAULT=XX // 1 << XX is the maximum sized allocation that will be in the tcache. android_common_cflags = [ // Default some parameters to small values to minimize PSS. // These parameters will be overridden by android_product_variables // for non-svelte configs. "-DANDROID_NUM_ARENAS=1", // This value cannot go below 2. "-DANDROID_TCACHE_NSLOTS_SMALL_MAX=2", "-DANDROID_TCACHE_NSLOTS_LARGE=1", ] android_product_variables = { // Only enable the tcache on non-svelte configurations, to save PSS. malloc_not_svelte: { cflags: [ "-DANDROID_ENABLE_TCACHE", "-DANDROID_LG_TCACHE_MAXCLASS_DEFAULT=16", "-UANDROID_NUM_ARENAS", "-DANDROID_NUM_ARENAS=2", "-UANDROID_TCACHE_NSLOTS_SMALL_MAX", "-DANDROID_TCACHE_NSLOTS_SMALL_MAX=8", "-UANDROID_TCACHE_NSLOTS_LARGE", "-DANDROID_TCACHE_NSLOTS_LARGE=16", ], }, } cc_defaults { name: "jemalloc5_defaults", host_supported: true, native_bridge_supported: true, cflags: common_cflags, target: { android: { cflags: android_common_cflags, product_variables: android_product_variables, }, linux_bionic: { enabled: true, }, }, local_include_dirs: common_c_local_includes, stl: "none", } lib_src_files = [ "src/jemalloc.c", "src/arena.c", "src/background_thread.c", "src/base.c", "src/bin.c", "src/bitmap.c", "src/ckh.c", "src/ctl.c", "src/div.c", "src/extent.c", "src/extent_dss.c", "src/extent_mmap.c", "src/hash.c", "src/hooks.c", "src/large.c", "src/log.c", "src/malloc_io.c", "src/mutex.c", "src/mutex_pool.c", "src/nstime.c", "src/pages.c", "src/prng.c", "src/prof.c", "src/rtree.c", "src/stats.c", "src/sz.c", "src/tcache.c", "src/ticker.c", "src/tsd.c", "src/witness.c", ] //----------------------------------------------------------------------- // jemalloc static library //----------------------------------------------------------------------- cc_library { name: "libjemalloc5", ramdisk_available: true, vendor_ramdisk_available: true, recovery_available: true, defaults: ["jemalloc5_defaults"], srcs: lib_src_files, export_include_dirs: ["include"], target: { android: { shared: { enabled: false, }, system_shared_libs: [], header_libs: ["libc_headers"], }, linux_bionic: { system_shared_libs: [], header_libs: ["libc_headers"], }, musl: { // Linking against musl uses libjemalloc5 by default, list only // libc_musl here to avoid a circular dependency. system_shared_libs: ["libc_musl"], }, }, } //----------------------------------------------------------------------- // jemalloc static jet library //----------------------------------------------------------------------- cc_library_static { name: "libjemalloc5_jet", defaults: ["jemalloc5_defaults"], cflags: [ "-DJEMALLOC_JET", ], srcs: lib_src_files, } jemalloc5_testlib_srcs = [ "test/src/btalloc.c", "test/src/btalloc_0.c", "test/src/btalloc_1.c", "test/src/math.c", "test/src/mtx.c", "test/src/mq.c", "test/src/SFMT.c", "test/src/test.c", "test/src/thd.c", "test/src/timer.c", ] //----------------------------------------------------------------------- // jemalloc unit test library //----------------------------------------------------------------------- cc_library_static { name: "libjemalloc5_unittest", defaults: ["jemalloc5_defaults"], cflags: [ "-DJEMALLOC_UNIT_TEST", ], local_include_dirs: [ "test/include", ], srcs: jemalloc5_testlib_srcs, whole_static_libs: ["libjemalloc5_jet"], } //----------------------------------------------------------------------- // jemalloc unit tests //----------------------------------------------------------------------- unit_tests = [ "test/unit/a0.c", "test/unit/arena_reset.c", "test/unit/atomic.c", "test/unit/background_thread.c", "test/unit/background_thread_enable.c", "test/unit/base.c", "test/unit/bitmap.c", "test/unit/ckh.c", "test/unit/decay.c", "test/unit/div.c", "test/unit/emitter.c", "test/unit/extent_quantize.c", "test/unit/fork.c", "test/unit/hash.c", "test/unit/hooks.c", "test/unit/junk.c", "test/unit/junk_alloc.c", "test/unit/junk_free.c", "test/unit/log.c", "test/unit/mallctl.c", "test/unit/malloc_io.c", "test/unit/math.c", "test/unit/mq.c", "test/unit/mtx.c", "test/unit/pack.c", "test/unit/pages.c", "test/unit/ph.c", "test/unit/prng.c", "test/unit/prof_accum.c", "test/unit/prof_active.c", "test/unit/prof_gdump.c", "test/unit/prof_idump.c", "test/unit/prof_reset.c", "test/unit/prof_tctx.c", "test/unit/prof_thread_name.c", "test/unit/ql.c", "test/unit/qr.c", "test/unit/rb.c", "test/unit/retained.c", "test/unit/rtree.c", "test/unit/SFMT.c", "test/unit/size_classes.c", "test/unit/slab.c", "test/unit/smoothstep.c", "test/unit/spin.c", "test/unit/stats.c", "test/unit/stats_print.c", "test/unit/ticker.c", "test/unit/nstime.c", "test/unit/tsd.c", "test/unit/witness.c", "test/unit/zero.c", ] cc_test { name: "jemalloc5_unittests", defaults: ["jemalloc5_defaults"], gtest: false, cflags: common_cflags + [ "-DJEMALLOC_UNIT_TEST", ], local_include_dirs: common_c_local_includes + [ "test/include", ], srcs: unit_tests, static_libs: ["libjemalloc5_unittest"], test_per_src: true, target: { linux_bionic: { enabled: true, }, linux_glibc: { // The sanitizer does not work for these tests on the host. sanitize: { never: true, }, }, }, } //----------------------------------------------------------------------- // jemalloc integration test library //----------------------------------------------------------------------- cc_library_static { name: "libjemalloc5_integrationtest", defaults: ["jemalloc5_defaults"], cflags: [ "-U_FORTIFY_SOURCE", "-DJEMALLOC_INTEGRATION_TEST", "-DJEMALLOC_NO_RENAME", ], local_include_dirs: [ "test/include", ], srcs: jemalloc5_testlib_srcs + lib_src_files, } //----------------------------------------------------------------------- // jemalloc integration tests //----------------------------------------------------------------------- integration_tests = [ "test/integration/aligned_alloc.c", "test/integration/allocated.c", "test/integration/extent.c", "test/integration/mallocx.c", "test/integration/MALLOCX_ARENA.c", "test/integration/overflow.c", "test/integration/posix_memalign.c", "test/integration/rallocx.c", "test/integration/sdallocx.c", "test/integration/thread_arena.c", "test/integration/xallocx.c", "test/integration/cpp/basic.cpp", ] cc_test { name: "jemalloc5_integrationtests", defaults: ["jemalloc5_defaults"], gtest: false, cflags: common_cflags + [ "-DJEMALLOC_INTEGRATION_TEST", "-DJEMALLOC_NO_RENAME", ], local_include_dirs: common_c_local_includes + [ "test/include", ], srcs: integration_tests, static_libs: ["libjemalloc5_integrationtest"], test_per_src: true, target: { linux_glibc: { // The sanitizer does not work for these tests on the host. sanitize: { never: true, }, }, }, // Needed for basic.cpp test. stl: "libc++_static", } //----------------------------------------------------------------------- // jemalloc stress test library //----------------------------------------------------------------------- cc_library_static { name: "libjemalloc5_stresstestlib", defaults: ["jemalloc5_defaults"], cflags: [ "-DJEMALLOC_STRESS_TEST", "-DJEMALLOC_STRESS_TESTLIB", ], local_include_dirs: [ "test/include", ], srcs: jemalloc5_testlib_srcs, } //----------------------------------------------------------------------- // jemalloc stress tests //----------------------------------------------------------------------- // All tests are in the same order as in the original jemalloc Makefile // to make it easier to track changes. stress_tests = [ "test/stress/microbench.c", ] cc_test { name: "jemalloc5_stresstests", defaults: ["jemalloc5_defaults"], gtest: false, cflags: common_cflags + [ "-DJEMALLOC_STRESS_TEST", ], local_include_dirs: common_c_local_includes + [ "test/include", ], srcs: stress_tests, static_libs: [ "libjemalloc5", "libjemalloc5_stresstestlib", "libjemalloc5_jet", ], test_per_src: true, target: { linux_glibc: { // The sanitizer does not work for these tests on the host. sanitize: { never: true, }, }, }, }