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