Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
2dc15985
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
1 年多 前同步成功
通知
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看板
未验证
提交
2dc15985
编写于
5月 31, 2023
作者:
O
openharmony_ci
提交者:
Gitee
5月 31, 2023
浏览文件
操作
浏览文件
下载
差异文件
!916 Optimize pthread_once performance
Merge pull request !916 from yinchuang/opt_pthread_once
上级
82e427c0
2d060eb8
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
72 addition
and
0 deletion
+72
-0
musl_src.gni
musl_src.gni
+1
-0
musl_template.gni
musl_template.gni
+9
-0
porting/linux/user/src/thread/pthread_once.c
porting/linux/user/src/thread/pthread_once.c
+62
-0
未找到文件。
musl_src.gni
浏览文件 @
2dc15985
...
...
@@ -2188,6 +2188,7 @@ musl_src_porting_file = [
"src/conf/legacy.c",
"src/conf/sysconf.c",
"src/env/getenv.c",
"src/thread/pthread_once.c",
]
musl_inc_hook_files = [
...
...
musl_template.gni
浏览文件 @
2dc15985
...
...
@@ -393,6 +393,15 @@ template("musl_libs") {
}
defines = []
if (musl_arch == "arm") {
defines += [ "MUSL_ARM_ARCH" ]
}
if (musl_arch == "aarch64") {
defines += [ "MUSL_AARCH64_ARCH" ]
}
if (musl_arch == "x86_64") {
defines += [ "MUSL_X86_64_ARCH" ]
}
if (musl_secure_level > 0) {
defines += [ "MALLOC_FREELIST_HARDENED" ]
}
...
...
porting/linux/user/src/thread/pthread_once.c
0 → 100644
浏览文件 @
2dc15985
#include "pthread_impl.h"
static
void
undo
(
void
*
control
)
{
/* Wake all waiters, since the waiter status is lost when
* resetting control to the initial state. */
if
(
a_swap
(
control
,
0
)
==
3
)
__wake
(
control
,
-
1
,
1
);
}
hidden
int
__pthread_once_full
(
pthread_once_t
*
control
,
void
(
*
init
)(
void
))
{
/* Try to enter initializing state. Four possibilities:
* 0 - we're the first or the other cancelled; run init
* 1 - another thread is running init; wait
* 2 - another thread finished running init; just return
* 3 - another thread is running init, waiters present; wait */
for
(;;)
switch
(
a_cas
(
control
,
0
,
1
))
{
case
0
:
pthread_cleanup_push
(
undo
,
control
);
init
();
pthread_cleanup_pop
(
0
);
if
(
a_swap
(
control
,
2
)
==
3
)
__wake
(
control
,
-
1
,
1
);
return
0
;
case
1
:
/* If this fails, so will __wait. */
a_cas
(
control
,
1
,
3
);
case
3
:
__wait
(
control
,
0
,
3
,
1
);
continue
;
case
2
:
return
0
;
}
}
#if defined(MUSL_AARCH64_ARCH) || defined(MUSL_ARM_ARCH)
int
__pthread_once
(
pthread_once_t
*
control
,
void
(
*
init
)(
void
))
{
/* Return immediately if init finished before, use load aquire to ensure that
* effects of the init routine are visible to the caller. */
if
(
a_ll
((
volatile
int
*
)
control
)
==
2
)
{
return
0
;
}
return
__pthread_once_full
(
control
,
init
);
}
#else
int
__pthread_once
(
pthread_once_t
*
control
,
void
(
*
init
)(
void
))
{
/* Return immediately if init finished before, but ensure that
* effects of the init routine are visible to the caller. */
if
(
*
(
volatile
int
*
)
control
==
2
)
{
a_barrier
();
return
0
;
}
return
__pthread_once_full
(
control
,
init
);
}
#endif
weak_alias
(
__pthread_once
,
pthread_once
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录