提交 f33d4710 编写于 作者: C ChenJie

support jemalloc

Signed-off-by: NChenJie <chenjie174@huawei.com>
上级 98306641
...@@ -32,6 +32,7 @@ declare_args() { ...@@ -32,6 +32,7 @@ declare_args() {
runtime_lib_path = runtime_lib_path =
"//prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/12.0.1/lib" "//prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/12.0.1/lib"
user_custom_libc = true user_custom_libc = true
use_jemalloc = false
musl_ported_dir = "intermidiates/${musl_target_os}/musl_src_ported" musl_ported_dir = "intermidiates/${musl_target_os}/musl_src_ported"
musl_inc_out_dir = "usr/include/${musl_target_triple}" musl_inc_out_dir = "usr/include/${musl_target_triple}"
uapi_dir = "//kernel/linux/patches/linux-5.10/prebuilts/usr/include" uapi_dir = "//kernel/linux/patches/linux-5.10/prebuilts/usr/include"
......
...@@ -207,6 +207,63 @@ template("musl_libs") { ...@@ -207,6 +207,63 @@ template("musl_libs") {
} }
} }
config("soft_jemalloc") {
configs = []
include_dirs = [
"${target_out_dir}/${musl_ported_dir}/arch/${musl_arch}",
"${target_out_dir}/${musl_ported_dir}/arch/generic",
"${target_out_dir}/${musl_ported_dir}/src/internal",
"${target_out_dir}/${musl_ported_dir}/src/include",
"${target_out_dir}/${musl_ported_dir}/include",
"${target_out_dir}/${musl_inc_out_dir}",
"${clang_base_path}/lib/clang/${clang_version}/include"
]
defines = [
"__OHOS__",
]
cflags = [
"--target=${musl_target_triple}",
"-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",
"-DOHOS_NUM_ARENAS=1",
]
if (musl_arch == "arm") {
cflags += [ "-march=armv7-a" ]
} else if (musl_arch == "aarch64") {
cflags += [ "-march=armv8" ]
}
include_dirs += [
"//third_party",
"//third_party/musl/src/include/",
"//third_party/jemalloc/include/",
"//third_party/jemalloc/include/jemalloc/internal",
"//third_party/jemalloc/include/jemalloc",
]
}
source_set("soft_musl_crt") { source_set("soft_musl_crt") {
sources = [ sources = [
"${target_out_dir}/${musl_ported_dir}/crt/${musl_arch}/crti.s", "${target_out_dir}/${musl_ported_dir}/crt/${musl_arch}/crti.s",
...@@ -452,6 +509,11 @@ template("musl_libs") { ...@@ -452,6 +509,11 @@ template("musl_libs") {
"-fstack-protector-strong", "-fstack-protector-strong",
] ]
if (use_jemalloc) {
defines += [ "USE_JEMALLOC" ]
include_dirs = [ "//third_party/jemalloc/include/jemalloc" ]
}
configs -= musl_inherited_configs configs -= musl_inherited_configs
configs += [ ":soft_musl_config" ] configs += [ ":soft_musl_config" ]
...@@ -694,6 +756,10 @@ template("musl_libs") { ...@@ -694,6 +756,10 @@ template("musl_libs") {
if (is_standard_system) { if (is_standard_system) {
deps += [ "//base/startup/init/services/param/base:parameterbase" ] deps += [ "//base/startup/init/services/param/base:parameterbase" ]
} }
if (use_jemalloc) {
deps += [ ":soft_musl_jemalloc"]
}
} }
action_foreach("soft_musl_crt_install_action") { action_foreach("soft_musl_crt_install_action") {
......
...@@ -12,6 +12,14 @@ ...@@ -12,6 +12,14 @@
#include "malloc_random.h" #include "malloc_random.h"
#include <sys/prctl.h> #include <sys/prctl.h>
#ifdef USE_JEMALLOC
#include <malloc.h>
extern void* je_malloc(size_t size);
extern void* je_calloc(size_t count, size_t size);
extern void* je_realloc(void* p, size_t newsize);
extern void je_free(void* p);
#endif
#if defined(__GNUC__) && defined(__PIC__) #if defined(__GNUC__) && defined(__PIC__)
#define inline inline __attribute__((always_inline)) #define inline inline __attribute__((always_inline))
#endif #endif
...@@ -448,6 +456,9 @@ void *__libc_malloc(size_t n) ...@@ -448,6 +456,9 @@ void *__libc_malloc(size_t n)
void *malloc(size_t n) void *malloc(size_t n)
#endif #endif
{ {
#ifdef USE_JEMALLOC
return je_malloc(n);
#endif
return internal_malloc(n); return internal_malloc(n);
} }
...@@ -555,6 +566,9 @@ static size_t mal0_clear(char *p, size_t pagesz, size_t n) ...@@ -555,6 +566,9 @@ static size_t mal0_clear(char *p, size_t pagesz, size_t n)
void *calloc(size_t m, size_t n) void *calloc(size_t m, size_t n)
{ {
#ifdef USE_JEMALLOC
return je_calloc(m, n);
#endif
if(n && m > (size_t)-1/n){ if(n && m > (size_t)-1/n){
errno=ENOMEM; errno=ENOMEM;
return 0; return 0;
...@@ -591,6 +605,9 @@ void *internal_calloc(size_t m, size_t n) ...@@ -591,6 +605,9 @@ void *internal_calloc(size_t m, size_t n)
void *realloc(void *p, size_t n) void *realloc(void *p, size_t n)
{ {
#ifdef USE_JEMALLOC
return je_realloc(p, n);
#endif
struct chunk *self, *next; struct chunk *self, *next;
size_t n0, n1; size_t n0, n1;
void *new; void *new;
...@@ -1036,6 +1053,9 @@ void __libc_free(void *p) ...@@ -1036,6 +1053,9 @@ void __libc_free(void *p)
void free(void *p) void free(void *p)
#endif #endif
{ {
#ifdef USE_JEMALLOC
return je_free(p);
#endif
return internal_free(p); return internal_free(p);
} }
...@@ -1065,6 +1085,7 @@ void internal_free(void *p) ...@@ -1065,6 +1085,7 @@ void internal_free(void *p)
void __malloc_donate(char *start, char *end) void __malloc_donate(char *start, char *end)
{ {
#ifndef USE_JEMALLOC
size_t align_start_up = (SIZE_ALIGN-1) & (-(uintptr_t)start - OVERHEAD); size_t align_start_up = (SIZE_ALIGN-1) & (-(uintptr_t)start - OVERHEAD);
size_t align_end_down = (SIZE_ALIGN-1) & (uintptr_t)end; size_t align_end_down = (SIZE_ALIGN-1) & (uintptr_t)end;
...@@ -1085,4 +1106,5 @@ void __malloc_donate(char *start, char *end) ...@@ -1085,4 +1106,5 @@ void __malloc_donate(char *start, char *end)
chunk_checksum_set(c); chunk_checksum_set(c);
#endif #endif
__bin_chunk(c); __bin_chunk(c);
#endif
} }
...@@ -5,10 +5,18 @@ ...@@ -5,10 +5,18 @@
#include "atomic.h" #include "atomic.h"
#endif #endif
#ifdef USE_JEMALLOC
extern size_t je_malloc_usable_size(void *p);
#endif
hidden void *(*const __realloc_dep)(void *, size_t) = realloc; hidden void *(*const __realloc_dep)(void *, size_t) = realloc;
size_t malloc_usable_size(void *p) size_t malloc_usable_size(void *p)
{ {
#ifdef USE_JEMALLOC
return je_malloc_usable_size(p);
#endif
#ifndef MALLOC_RED_ZONE #ifndef MALLOC_RED_ZONE
return p ? CHUNK_SIZE(MEM_TO_CHUNK(p)) - OVERHEAD : 0; return p ? CHUNK_SIZE(MEM_TO_CHUNK(p)) - OVERHEAD : 0;
#else #else
......
#include <stdlib.h> #include <stdlib.h>
#ifndef USE_JEMALLOC
#include <stdint.h> #include <stdint.h>
#include <errno.h> #include <errno.h>
#include "malloc_impl.h" #include "malloc_impl.h"
#include "malloc_config.h" #include "malloc_config.h"
#else
extern void* je_memalign(size_t align, size_t len);
#endif
void *__memalign(size_t align, size_t len) void *__memalign(size_t align, size_t len)
{ {
#ifdef USE_JEMALLOC
return je_memalign(align, len);
#else
unsigned char *mem, *new; unsigned char *mem, *new;
if ((align & -align) != align) { if ((align & -align) != align) {
...@@ -66,6 +74,7 @@ void *__memalign(size_t align, size_t len) ...@@ -66,6 +74,7 @@ void *__memalign(size_t align, size_t len)
__bin_chunk(c); __bin_chunk(c);
return new; return new;
#endif
} }
weak_alias(__memalign, memalign); weak_alias(__memalign, memalign);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册