未验证 提交 9836671d 编写于 作者: O openharmony_ci 提交者: Gitee

!764 add dfx interfaces for jemalloc

Merge pull request !764 from 陈杰/je-dfx-trunk
......@@ -35,6 +35,7 @@ declare_args() {
"//prebuilts/clang/ohos/linux-x86_64/llvm/lib/clang/12.0.1/lib"
user_custom_libc = true
use_jemalloc = false
use_jemalloc_dfx_intf = false
musl_ported_dir = "intermidiates/${musl_target_os}/musl_src_ported"
musl_inc_out_dir = "usr/include/${musl_target_triple}"
uapi_dir = "//kernel/linux/patches/linux-5.10/prebuilts/usr/include"
......
......@@ -534,6 +534,9 @@ template("musl_libs") {
if (use_jemalloc) {
defines += [ "USE_JEMALLOC" ]
if (use_jemalloc_dfx_intf) {
defines += [ "USE_JEMALLOC_DFX_INTF" ]
}
include_dirs = [ "//third_party/jemalloc/include/jemalloc" ]
}
......
......@@ -49,6 +49,17 @@ void malloc_enable(void);
int malloc_info(int options, FILE* fp);
void malloc_stats_print(void (*write_cb) (void *, const char *), void *cbopaque, const char *opts);
#define M_SET_THREAD_CACHE -1001
#define M_THREAD_CACHE_ENABLE 1
#define M_THREAD_CACHE_DISABLE 0
#define M_FLUSH_THREAD_CACHE -1002
#define M_DELAYED_FREE -1003
#define M_DELAYED_FREE_ENABLE 1
#define M_DELAYED_FREE_DISABLE 0
int mallopt(int param, int value);
ssize_t malloc_backtrace(void* pointer, uintptr_t* frames, size_t frame_count);
......
......@@ -80,4 +80,14 @@ size_t malloc_usable_size(void* addr)
return MuslMalloc(malloc_usable_size)(addr);
}
}
int mallopt(int param, int value)
{
volatile const struct MallocDispatchType* dispatch_table = get_current_dispatch_table();
if (__predict_false(dispatch_table != NULL)) {
return dispatch_table->mallopt(param, value);
} else {
return MuslMalloc(mallopt)(param, value);
}
}
#endif
......@@ -17,6 +17,13 @@ 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);
#ifdef USE_JEMALLOC_DFX_INTF
extern void je_malloc_disable();
extern void je_malloc_enable();
extern int je_iterate(uintptr_t base, size_t size,
void (*callback)(uintptr_t ptr, size_t size, void* arg), void* arg);
extern int je_mallopt(int param, int value);
#endif
#endif
#if defined(__GNUC__) && defined(__PIC__)
......@@ -159,7 +166,9 @@ void __pop_chunk(struct chunk *c)
void malloc_disable(void)
{
#ifdef MUSL_ITERATE_AND_STATS_API
#ifdef USE_JEMALLOC_DFX_INTF
je_malloc_disable();
#elif defined(MUSL_ITERATE_AND_STATS_API)
lock(mal.free_lock);
lock(total_heap_space_inc_lock);
for (size_t i = 0; i < BINS_COUNT; ++i) {
......@@ -173,7 +182,9 @@ void malloc_disable(void)
void malloc_enable(void)
{
#ifdef MUSL_ITERATE_AND_STATS_API
#ifdef USE_JEMALLOC_DFX_INTF
je_malloc_enable();
#elif defined(MUSL_ITERATE_AND_STATS_API)
for (size_t i = 0; i < OCCUPIED_BIN_COUNT; ++i) {
unlock(mal.occupied_bins[i].lock);
}
......@@ -211,7 +222,9 @@ static void malloc_iterate_occupied_bin(occupied_bin_t *occupied_bin, iterate_in
int malloc_iterate(void* base, size_t size, void (*callback)(void* base, size_t size, void* arg), void* arg)
{
#ifdef MUSL_ITERATE_AND_STATS_API
#ifdef USE_JEMALLOC_DFX_INTF
return je_iterate(base, size, callback, arg);
#elif defined(MUSL_ITERATE_AND_STATS_API)
uintptr_t ptr = (uintptr_t)base;
uintptr_t end_ptr = ptr + size;
iterate_info_t iterate_info = {ptr, end_ptr, callback, arg};
......@@ -1303,8 +1316,15 @@ void __malloc_donate(char *start, char *end)
#endif
}
#ifdef HOOK_ENABLE
int __libc_mallopt(int param, int value)
#else
int mallopt(int param, int value)
#endif
{
#ifdef USE_JEMALLOC_DFX_INTF
return je_mallopt(int param, int value);
#endif
return 0;
}
......
......@@ -231,9 +231,17 @@ int malloc_info(int options, FILE* fp)
return 0;
}
#ifdef USE_JEMALLOC_DFX_INTF
extern struct mallinfo je_mallinfo();
extern je_malloc_stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
const char *opts);
#endif
void malloc_stats_print(void (*write_cb) (void *, const char *), void *cbopaque, const char *opts)
{
#ifdef MUSL_ITERATE_AND_STATS_API
#ifdef USE_JEMALLOC_DFX_INTF
je_malloc_stats_print(write_cb, cbopaque, opts);
#elif defined(MUSL_ITERATE_AND_STATS_API)
malloc_disable();
stat_printf(
write_cb,
......@@ -252,7 +260,17 @@ void malloc_stats_print(void (*write_cb) (void *, const char *), void *cbopaque,
struct mallinfo2 mallinfo2(void)
{
#ifdef MUSL_ITERATE_AND_STATS_API
#ifdef USE_JEMALLOC_DFX_INTF
struct mallinfo info = je_mallinfo();
struct mallinfo2 res = {
.hblks = info.hblks,
.hblkhd = info.hblkhd,
.usmblks = info.usmblks,
.uordblks = info.uordblks,
.fordblks = info.fordblks,
};
return res;
#elif defined(MUSL_ITERATE_AND_STATS_API)
malloc_disable();
malloc_stats_t shared_stats = {0, 0, 0, 0};
for (size_t i = 0; i < OCCUPIED_BIN_COUNT; ++i) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册