Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
9b9dafc8
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看板
未验证
提交
9b9dafc8
编写于
6月 30, 2023
作者:
O
openharmony_ci
提交者:
Gitee
6月 30, 2023
浏览文件
操作
浏览文件
下载
差异文件
!931 Optimize pthread_mutex_timedlock and pthread_mutex_lock performance
Merge pull request !931 from qijinquan/timedlock
上级
1f60b5be
787cba3a
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
89 addition
and
71 deletion
+89
-71
musl_src.gni
musl_src.gni
+1
-0
porting/linux/user/src/thread/pthread_mutex_lock.c
porting/linux/user/src/thread/pthread_mutex_lock.c
+12
-0
porting/linux/user/src/thread/pthread_mutex_timedlock.c
porting/linux/user/src/thread/pthread_mutex_timedlock.c
+76
-71
未找到文件。
musl_src.gni
浏览文件 @
9b9dafc8
...
...
@@ -2115,6 +2115,7 @@ musl_src_porting_file = [
"src/thread/arm/syscall_cp.s",
"src/thread/pthread_mutex_clocklock.c",
"src/thread/pthread_mutex_timedlock.c",
"src/thread/pthread_mutex_lock.c",
"src/thread/pthread_mutex_timedlock_monotonic_np.c",
"src/thread/pthread_mutex_lock_timeout_np.c",
"src/thread/pthread_rwlock_clockrdlock.c",
...
...
porting/linux/user/src/thread/pthread_mutex_lock.c
0 → 100644
浏览文件 @
9b9dafc8
#include "pthread_impl.h"
extern
int
__pthread_mutex_timedlock_inner
(
pthread_mutex_t
*
restrict
m
,
const
struct
timespec
*
restrict
at
);
int
__pthread_mutex_lock
(
pthread_mutex_t
*
m
)
{
if
((
m
->
_m_type
&
15
)
==
PTHREAD_MUTEX_NORMAL
&&
!
a_cas
(
&
m
->
_m_lock
,
0
,
EBUSY
))
return
0
;
return
__pthread_mutex_timedlock_inner
(
m
,
0
);
}
weak_alias
(
__pthread_mutex_lock
,
pthread_mutex_lock
);
porting/linux/user/src/thread/pthread_mutex_timedlock.c
浏览文件 @
9b9dafc8
...
...
@@ -21,91 +21,96 @@
static
int
__futex4
(
volatile
void
*
addr
,
int
op
,
int
val
,
const
struct
timespec
*
to
)
{
#ifdef SYS_futex_time64
time_t
s
=
to
?
to
->
tv_sec
:
0
;
long
ns
=
to
?
to
->
tv_nsec
:
0
;
int
r
=
-
ENOSYS
;
if
(
SYS_futex
==
SYS_futex_time64
||
!
IS32BIT
(
s
))
r
=
__syscall
(
SYS_futex_time64
,
addr
,
op
,
val
,
to
?
((
long
long
[])
{
s
,
ns
})
:
0
);
if
(
SYS_futex
==
SYS_futex_time64
||
r
!=-
ENOSYS
)
return
r
;
to
=
to
?
(
void
*
)(
long
[])
{
CLAMP
(
s
),
ns
}
:
0
;
time_t
s
=
to
?
to
->
tv_sec
:
0
;
long
ns
=
to
?
to
->
tv_nsec
:
0
;
int
r
=
-
ENOSYS
;
if
(
SYS_futex
==
SYS_futex_time64
||
!
IS32BIT
(
s
))
r
=
__syscall
(
SYS_futex_time64
,
addr
,
op
,
val
,
to
?
((
long
long
[])
{
s
,
ns
})
:
0
);
if
(
SYS_futex
==
SYS_futex_time64
||
r
!=-
ENOSYS
)
return
r
;
to
=
to
?
(
void
*
)(
long
[])
{
CLAMP
(
s
),
ns
}
:
0
;
#endif
return
__syscall
(
SYS_futex
,
addr
,
op
,
val
,
to
);
return
__syscall
(
SYS_futex
,
addr
,
op
,
val
,
to
);
}
static
int
pthread_mutex_timedlock_pi
(
pthread_mutex_t
*
restrict
m
,
const
struct
timespec
*
restrict
at
)
{
int
clock
=
m
->
_m_clock
;
int
type
=
m
->
_m_type
;
int
priv
=
(
type
&
128
)
^
128
;
pthread_t
self
=
__pthread_self
();
int
e
;
int
clock
=
m
->
_m_clock
;
int
type
=
m
->
_m_type
;
int
priv
=
(
type
&
128
)
^
128
;
pthread_t
self
=
__pthread_self
();
int
e
;
if
(
!
priv
)
self
->
robust_list
.
pending
=
&
m
->
_m_next
;
if
(
!
priv
)
self
->
robust_list
.
pending
=
&
m
->
_m_next
;
do
e
=
-
__futex4
(
&
m
->
_m_lock
,
FUTEX_LOCK_PI
|
priv
,
0
,
at
);
while
(
e
==
EINTR
);
if
(
e
)
self
->
robust_list
.
pending
=
0
;
do
e
=
-
__futex4
(
&
m
->
_m_lock
,
FUTEX_LOCK_PI
|
priv
,
0
,
at
);
while
(
e
==
EINTR
);
if
(
e
)
self
->
robust_list
.
pending
=
0
;
switch
(
e
)
{
case
0
:
/* Catch spurious success for non-robust mutexes. */
if
(
!
(
type
&
4
)
&&
((
m
->
_m_lock
&
0x40000000
)
||
m
->
_m_waiters
))
{
a_store
(
&
m
->
_m_waiters
,
-
1
);
__syscall
(
SYS_futex
,
&
m
->
_m_lock
,
FUTEX_UNLOCK_PI
|
priv
);
self
->
robust_list
.
pending
=
0
;
break
;
}
/* Signal to trylock that we already have the lock. */
m
->
_m_count
=
-
1
;
return
__pthread_mutex_trylock
(
m
);
case
ETIMEDOUT
:
return
e
;
case
EDEADLK
:
if
((
type
&
3
)
==
PTHREAD_MUTEX_ERRORCHECK
)
return
e
;
default:
break
;
}
do
e
=
__timedwait
(
&
(
int
)
{
0
},
0
,
clock
,
at
,
1
);
while
(
e
!=
ETIMEDOUT
);
return
e
;
switch
(
e
)
{
case
0
:
/* Catch spurious success for non-robust mutexes. */
if
(
!
(
type
&
4
)
&&
((
m
->
_m_lock
&
0x40000000
)
||
m
->
_m_waiters
))
{
a_store
(
&
m
->
_m_waiters
,
-
1
);
__syscall
(
SYS_futex
,
&
m
->
_m_lock
,
FUTEX_UNLOCK_PI
|
priv
);
self
->
robust_list
.
pending
=
0
;
break
;
}
/* Signal to trylock that we already have the lock. */
m
->
_m_count
=
-
1
;
return
__pthread_mutex_trylock_owner
(
m
);
case
ETIMEDOUT
:
return
e
;
case
EDEADLK
:
if
((
type
&
3
)
==
PTHREAD_MUTEX_ERRORCHECK
)
return
e
;
}
do
e
=
__timedwait
(
&
(
int
){
0
},
0
,
clock
,
at
,
1
);
while
(
e
!=
ETIMEDOUT
);
return
e
;
}
int
__pthread_mutex_timedlock
(
pthread_mutex_t
*
restrict
m
,
const
struct
timespec
*
restrict
at
)
int
__pthread_mutex_timedlock
_inner
(
pthread_mutex_t
*
restrict
m
,
const
struct
timespec
*
restrict
at
)
{
if
((
m
->
_m_type
&
15
)
==
PTHREAD_MUTEX_NORMAL
&&
!
a_cas
(
&
m
->
_m_lock
,
0
,
EBUSY
))
return
0
;
int
clock
=
(
m
->
_m_clock
==
CLOCK_MONOTONIC
)
?
CLOCK_MONOTONIC
:
CLOCK_REALTIME
;
int
type
=
m
->
_m_type
;
int
r
,
t
,
priv
=
(
type
&
128
)
^
128
;
r
=
__pthread_mutex_trylock
(
m
);
if
(
r
!=
EBUSY
)
return
r
;
if
(
type
&
8
)
return
pthread_mutex_timedlock_pi
(
m
,
at
);
int
type
=
m
->
_m_type
;
int
r
;
// PI
if
(
type
&
8
)
{
r
=
__pthread_mutex_trylock_owner
(
m
);
if
(
r
!=
EBUSY
)
return
r
;
return
pthread_mutex_timedlock_pi
(
m
,
at
);
}
r
=
__pthread_mutex_trylock
(
m
);
if
(
r
!=
EBUSY
)
return
r
;
int
clock
=
(
m
->
_m_clock
==
CLOCK_MONOTONIC
)
?
CLOCK_MONOTONIC
:
CLOCK_REALTIME
;
int
t
,
priv
=
(
type
&
128
)
^
128
;
int
spins
=
100
;
while
(
spins
--
&&
m
->
_m_lock
&&
!
m
->
_m_waiters
)
a_spin
();
int
spins
=
100
;
while
(
spins
--
&&
m
->
_m_lock
&&
!
m
->
_m_waiters
)
a_spin
();
while
((
r
=
__pthread_mutex_trylock
(
m
))
==
EBUSY
)
{
r
=
m
->
_m_lock
;
int
own
=
r
&
0x3fffffff
;
if
(
!
own
&&
(
!
r
||
(
type
&
4
)))
continue
;
if
((
type
&
3
)
==
PTHREAD_MUTEX_ERRORCHECK
&&
own
==
__pthread_self
()
->
tid
)
return
EDEADLK
;
while
((
r
=
__pthread_mutex_trylock
(
m
))
==
EBUSY
)
{
r
=
m
->
_m_lock
;
int
own
=
r
&
0x3fffffff
;
if
(
!
own
&&
(
!
r
||
(
type
&
4
)))
continue
;
if
((
type
&
3
)
==
PTHREAD_MUTEX_ERRORCHECK
&&
own
==
__pthread_self
()
->
tid
)
return
EDEADLK
;
a_inc
(
&
m
->
_m_waiters
);
t
=
r
|
0x80000000
;
a_cas
(
&
m
->
_m_lock
,
r
,
t
);
r
=
__timedwait
(
&
m
->
_m_lock
,
t
,
clock
,
at
,
priv
);
a_dec
(
&
m
->
_m_waiters
);
if
(
r
&&
r
!=
EINTR
)
break
;
}
return
r
;
}
a_inc
(
&
m
->
_m_waiters
);
t
=
r
|
0x80000000
;
a_cas
(
&
m
->
_m_lock
,
r
,
t
);
r
=
__timedwait
(
&
m
->
_m_lock
,
t
,
clock
,
at
,
priv
);
a_dec
(
&
m
->
_m_waiters
);
if
(
r
&&
r
!=
EINTR
)
break
;
}
return
r
;
int
__pthread_mutex_timedlock
(
pthread_mutex_t
*
restrict
m
,
const
struct
timespec
*
restrict
at
)
{
if
((
m
->
_m_type
&
15
)
==
PTHREAD_MUTEX_NORMAL
&&
!
a_cas
(
&
m
->
_m_lock
,
0
,
EBUSY
))
return
0
;
return
__pthread_mutex_timedlock_inner
(
m
,
at
);
}
weak_alias
(
__pthread_mutex_timedlock
,
pthread_mutex_timedlock
);
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录