Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
88b77adc
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
11 个月 前同步成功
通知
37
Star
125
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Musl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
88b77adc
编写于
11月 07, 2022
作者:
O
olefirenque
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: rework stats implementation
Signed-off-by:
N
olefirenque
<
olefirenko.egor@huawei-partners.com
>
上级
dddb371a
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
105 addition
and
107 deletion
+105
-107
include/malloc.h
include/malloc.h
+14
-24
ndk_musl_include/malloc.h
ndk_musl_include/malloc.h
+14
-24
porting/linux/user/include/malloc.h
porting/linux/user/include/malloc.h
+14
-24
porting/linux/user/src/internal/malloc_impl.h
porting/linux/user/src/internal/malloc_impl.h
+3
-3
porting/linux/user/src/malloc/malloc.c
porting/linux/user/src/malloc/malloc.c
+7
-10
porting/linux/user/src/malloc/stats.c
porting/linux/user/src/malloc/stats.c
+53
-22
未找到文件。
include/malloc.h
浏览文件 @
88b77adc
...
...
@@ -18,33 +18,23 @@ void *memalign(size_t, size_t);
size_t
malloc_usable_size
(
void
*
);
struct
mallinfo
{
int
arena
;
int
ordblks
;
int
smblks
;
int
hblks
;
int
hblkhd
;
int
usmblks
;
int
fsmblks
;
int
uordblks
;
int
fordblks
;
int
keepcost
;
};
#define __MALLINFO_BODY \
size_t arena; \
size_t ordblks; \
size_t smblks; \
size_t hblks; \
size_t hblkhd; \
size_t usmblks; \
size_t fsmblks; \
size_t uordblks; \
size_t fordblks; \
size_t keepcost;
struct
mallinfo
{
__MALLINFO_BODY
};
struct
mallinfo
mallinfo
(
void
);
struct
mallinfo2
{
size_t
arena
;
size_t
ordblks
;
size_t
smblks
;
size_t
hblks
;
size_t
hblkhd
;
size_t
usmblks
;
size_t
fsmblks
;
size_t
uordblks
;
size_t
fordblks
;
size_t
keepcost
;
};
struct
mallinfo2
{
__MALLINFO_BODY
};
struct
mallinfo2
mallinfo2
(
void
);
...
...
ndk_musl_include/malloc.h
浏览文件 @
88b77adc
...
...
@@ -18,31 +18,21 @@ void *memalign(size_t, size_t);
size_t
malloc_usable_size
(
void
*
);
struct
mallinfo
{
int
arena
;
int
ordblks
;
int
smblks
;
int
hblks
;
int
hblkhd
;
int
usmblks
;
int
fsmblks
;
int
uordblks
;
int
fordblks
;
int
keepcost
;
};
struct
mallinfo2
{
size_t
arena
;
size_t
ordblks
;
size_t
smblks
;
size_t
hblks
;
size_t
hblkhd
;
size_t
usmblks
;
size_t
fsmblks
;
size_t
uordblks
;
size_t
fordblks
;
#define __MALLINFO_BODY \
size_t arena; \
size_t ordblks; \
size_t smblks; \
size_t hblks; \
size_t hblkhd; \
size_t usmblks; \
size_t fsmblks; \
size_t uordblks; \
size_t fordblks; \
size_t keepcost;
};
struct
mallinfo
{
__MALLINFO_BODY
};
struct
mallinfo2
{
__MALLINFO_BODY
};
#ifdef __cplusplus
}
...
...
porting/linux/user/include/malloc.h
浏览文件 @
88b77adc
...
...
@@ -22,33 +22,23 @@ void *memalign(size_t, size_t);
size_t
malloc_usable_size
(
void
*
);
struct
mallinfo
{
int
arena
;
int
ordblks
;
int
smblks
;
int
hblks
;
int
hblkhd
;
int
usmblks
;
int
fsmblks
;
int
uordblks
;
int
fordblks
;
int
keepcost
;
};
#define __MALLINFO_BODY \
size_t arena; \
size_t ordblks; \
size_t smblks; \
size_t hblks; \
size_t hblkhd; \
size_t usmblks; \
size_t fsmblks; \
size_t uordblks; \
size_t fordblks; \
size_t keepcost;
struct
mallinfo
{
__MALLINFO_BODY
};
struct
mallinfo
mallinfo
(
void
);
struct
mallinfo2
{
size_t
arena
;
size_t
ordblks
;
size_t
smblks
;
size_t
hblks
;
size_t
hblkhd
;
size_t
usmblks
;
size_t
fsmblks
;
size_t
uordblks
;
size_t
fordblks
;
size_t
keepcost
;
};
struct
mallinfo2
{
__MALLINFO_BODY
};
struct
mallinfo2
mallinfo2
(
void
);
...
...
porting/linux/user/src/internal/malloc_impl.h
浏览文件 @
88b77adc
...
...
@@ -15,7 +15,7 @@ typedef struct occupied_bin_s {
struct
chunk
*
head
,
*
tail
;
volatile
int
lock
[
2
];
}
occupied_bin_t
;
struct
chunk
{
size_t
psize
,
csize
;
#ifdef MALLOC_RED_ZONE
...
...
@@ -23,7 +23,7 @@ struct chunk {
size_t
state
;
#endif
#ifdef MUSL_ITERATE_AND_STATS_API
pthread
_t
thread_id
;
size
_t
thread_id
;
struct
chunk
*
next_occupied
,
*
prev_occupied
;
#endif
struct
chunk
*
next
,
*
prev
;
...
...
@@ -57,7 +57,7 @@ hidden size_t __get_total_heap_space(void);
#ifdef MUSL_ITERATE_AND_STATS_API
#define OCCUPIED_BIN_COUNT 64
#define OCCUPIED_LIST_OVERHEAD (2*sizeof(void*))
#define ITERATE_AND_STATS_OVERHEAD (sizeof(
void*
) + OCCUPIED_LIST_OVERHEAD)
#define ITERATE_AND_STATS_OVERHEAD (sizeof(
size_t
) + OCCUPIED_LIST_OVERHEAD)
#else
#define ITERATE_AND_STATS_OVERHEAD (0)
#endif
...
...
porting/linux/user/src/malloc/malloc.c
浏览文件 @
88b77adc
...
...
@@ -43,8 +43,6 @@ int __malloc_replaced;
#ifdef MUSL_ITERATE_AND_STATS_API
occupied_bin_t
detached_occupied_bin
;
/* Usable memory only, excluding overhead for chunks */
size_t
total_heap_space
=
0
;
volatile
int
total_heap_space_inc_lock
[
2
];
...
...
@@ -65,7 +63,7 @@ occupied_bin_t *__get_occupied_bin_by_idx(size_t bin_index)
return
&
mal
.
occupied_bins
[
bin_index
];
}
static
inline
size_t
get_occupied_bin_index
(
pthread_
t
thread_id
)
static
inline
size_t
get_occupied_bin_index
(
in
t
thread_id
)
{
return
(
size_t
)
((
size_t
)
thread_id
%
OCCUPIED_BIN_COUNT
);
}
...
...
@@ -73,12 +71,12 @@ static inline size_t get_occupied_bin_index(pthread_t thread_id)
occupied_bin_t
*
__get_occupied_bin
(
struct
chunk
*
c
)
{
size_t
bin_index
=
get_occupied_bin_index
(
c
->
thread_id
);
return
&
mal
.
occupied_bins
[
bin_index
]
;
return
__get_occupied_bin_by_idx
(
bin_index
)
;
}
occupied_bin_t
*
__get_current_occupied_bin
()
{
size_t
bin_index
=
get_occupied_bin_index
(
__pthread_self
());
size_t
bin_index
=
get_occupied_bin_index
(
__pthread_self
()
->
tid
);
return
&
mal
.
occupied_bins
[
bin_index
];
}
#endif
...
...
@@ -125,7 +123,7 @@ void __push_chunk(struct chunk *c)
occupied_bin
->
tail
=
c
;
}
occupied_bin
->
head
=
c
;
c
->
thread_id
=
__pthread_self
();
c
->
thread_id
=
__pthread_self
()
->
tid
;
unlock
(
occupied_bin
->
lock
);
}
...
...
@@ -164,8 +162,6 @@ void malloc_disable(void)
for
(
size_t
i
=
0
;
i
<
BINS_COUNT
;
++
i
)
{
lock
(
mal
.
bins
[
i
].
lock
);
}
// FIXME???
// __tl_lock();
for
(
size_t
i
=
0
;
i
<
OCCUPIED_BIN_COUNT
;
++
i
)
{
lock
(
mal
.
occupied_bins
[
i
].
lock
);
}
...
...
@@ -175,11 +171,12 @@ void malloc_disable(void)
void
malloc_enable
(
void
)
{
#ifdef MUSL_ITERATE_AND_STATS_API
// FIXME???
// __tl_unlock();
for
(
size_t
i
=
0
;
i
<
OCCUPIED_BIN_COUNT
;
++
i
)
{
unlock
(
mal
.
occupied_bins
[
i
].
lock
);
}
for
(
size_t
i
=
0
;
i
<
BINS_COUNT
;
++
i
)
{
unlock
(
mal
.
bins
[
i
].
lock
);
}
unlock
(
total_heap_space_inc_lock
);
unlock
(
mal
.
free_lock
);
#endif
...
...
porting/linux/user/src/malloc/stats.c
浏览文件 @
88b77adc
...
...
@@ -44,7 +44,11 @@ static void stat_printf(write_cb_fun *write_cb, void *write_cb_arg, const char *
va_start
(
args
,
fmt
);
char
buf
[
STAT_PRINTF_MAX_LEN
+
1
];
if
(
vsnprintf
(
buf
,
STAT_PRINTF_MAX_LEN
,
fmt
,
args
))
{
write_cb
(
write_cb_arg
,
buf
);
if
(
write_cb
!=
NULL
)
{
write_cb
(
write_cb_arg
,
buf
);
}
else
{
printf
(
buf
);
}
}
else
{
fprintf
(
stderr
,
"Error writing to buffer"
);
}
...
...
@@ -109,20 +113,51 @@ static malloc_stats_t add_up_chunks(occupied_bin_t *occupied_bin)
return
stats
;
}
static
malloc_stats_t
add_up_chunks_by_threads
(
occupied_bin_t
*
occupied_bin
,
int
tid
)
{
malloc_stats_t
stats
=
{
0
,
0
,
0
,
0
};
for
(
struct
chunk
*
c
=
occupied_bin
->
head
;
c
!=
NULL
;
c
=
c
->
next_occupied
)
{
if
(
c
->
thread_id
==
tid
)
{
size_t
chunk_memory
=
CHUNK_SIZE
(
c
)
-
OVERHEAD
;
stats
.
total_allocated_memory
+=
chunk_memory
;
if
(
IS_MMAPPED
(
c
))
{
stats
.
mmapped_regions
++
;
stats
.
total_mmapped_memory
+=
chunk_memory
;
}
else
{
stats
.
total_allocated_heap_space
+=
chunk_memory
;
}
}
}
return
stats
;
}
static
size_t
print_threads
(
write_cb_fun
*
write_cb
,
void
*
write_cb_arg
,
print_mode
mode
)
{
size_t
total_allocated_heap_space
=
0
;
for
(
size_t
i
=
0
;
i
<
OCCUPIED_BIN_COUNT
;
++
i
)
{
occupied_bin_t
*
occupied_bin
=
__get_occupied_bin_by_idx
(
i
);
malloc_stats_t
stats
=
add_up_chunks
(
occupied_bin
);
total_allocated_heap_space
+=
stats
.
total_allocated_heap_space
;
//FIXME: Egor, this is incorrect
if
(
mode
==
TABLE
)
{
print_thread_stats_table
(
write_cb
,
write_cb_arg
,
0
,
&
stats
);
}
else
{
print_thread_stats_xml
(
write_cb
,
write_cb_arg
,
0
,
&
stats
);
}
int
min_id
=
0
;
int
found
;
do
{
found
=
0
;
for
(
struct
chunk
*
c
=
occupied_bin
->
head
;
c
!=
NULL
;
c
=
c
->
next_occupied
)
{
if
(
c
->
thread_id
>
min_id
)
{
min_id
=
c
->
thread_id
;
found
=
1
;
}
}
if
(
found
)
{
malloc_stats_t
stats
=
add_up_chunks_by_threads
(
occupied_bin
,
min_id
);
total_allocated_heap_space
+=
stats
.
total_allocated_heap_space
;
if
(
mode
==
TABLE
)
{
print_thread_stats_table
(
write_cb
,
write_cb_arg
,
min_id
,
&
stats
);
}
else
{
print_thread_stats_xml
(
write_cb
,
write_cb_arg
,
min_id
,
&
stats
);
}
}
}
while
(
found
);
}
return
total_allocated_heap_space
;
...
...
@@ -220,14 +255,10 @@ struct mallinfo2 mallinfo2(void)
#ifdef MUSL_ITERATE_AND_STATS_API
malloc_disable
();
malloc_stats_t
shared_stats
=
{
0
,
0
,
0
,
0
};
struct
__pthread
*
self
,
*
it
;
self
=
it
=
__pthread_self
();
//FIXME:
// do {
// malloc_stats_t stats = add_up_chunks(__get_occupied_bin(it));
// add_stats(&shared_stats, &stats);
// it = it->next;
// } while (it != self);
for
(
size_t
i
=
0
;
i
<
OCCUPIED_BIN_COUNT
;
++
i
)
{
malloc_stats_t
stats
=
add_up_chunks
(
__get_occupied_bin_by_idx
(
i
));
add_stats
(
&
shared_stats
,
&
stats
);
}
struct
mallinfo2
res
=
{
.
hblks
=
shared_stats
.
mmapped_regions
,
...
...
@@ -245,9 +276,9 @@ struct mallinfo mallinfo(void)
{
struct
mallinfo2
mallinfo2_res
=
mallinfo2
();
return
(
struct
mallinfo
)
{
.
hblks
=
(
int
)
mallinfo2_res
.
hblks
,
.
hblkhd
=
(
int
)
mallinfo2_res
.
hblkhd
,
.
uordblks
=
(
int
)
mallinfo2_res
.
uordblks
,
.
fordblks
=
(
int
)
mallinfo2_res
.
fordblks
,
.
hblks
=
mallinfo2_res
.
hblks
,
.
hblkhd
=
mallinfo2_res
.
hblkhd
,
.
uordblks
=
mallinfo2_res
.
uordblks
,
.
fordblks
=
mallinfo2_res
.
fordblks
,
};
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录