Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
94a5fb99
提交
94a5fb99
4月 08, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
annotate some logical sharing in the futex impl
上级
264a783d
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
9 行增加
和
0 行删除
+9
-0
futex.cc
kernel/futex.cc
+6
-0
sysproc.cc
kernel/sysproc.cc
+3
-0
没有找到文件。
kernel/futex.cc
浏览文件 @
94a5fb99
...
@@ -8,6 +8,7 @@
...
@@ -8,6 +8,7 @@
#include "proc.hh"
#include "proc.hh"
#include "cpu.hh"
#include "cpu.hh"
#include "percpu.hh"
#include "percpu.hh"
#include "kmtrace.hh"
//
//
// futexkey
// futexkey
...
@@ -171,6 +172,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
...
@@ -171,6 +172,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
{
{
futexaddr
*
fa
;
futexaddr
*
fa
;
mtreadavar
(
"futex:ns:%lx"
,
key
);
{
{
scoped_gc_epoch
gc
;
scoped_gc_epoch
gc
;
again
:
again
:
...
@@ -185,6 +187,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
...
@@ -185,6 +187,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
fa
->
dec
();
fa
->
dec
();
goto
again
;
goto
again
;
}
}
mtwriteavar
(
"futex:ns:%lx"
,
key
);
fa
->
inserted_
=
true
;
fa
->
inserted_
=
true
;
}
else
{
}
else
{
if
(
!
fa
->
tryinc
())
{
if
(
!
fa
->
tryinc
())
{
...
@@ -193,6 +196,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
...
@@ -193,6 +196,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
}
}
}
}
assert
(
fa
->
key_
==
key
);
assert
(
fa
->
key_
==
key
);
mtwriteavar
(
"futex:%lx.%p"
,
key
,
fa
);
acquire
(
&
myproc
()
->
futex_lock
);
acquire
(
&
myproc
()
->
futex_lock
);
auto
cleanup
=
scoped_cleanup
([
&
fa
](){
auto
cleanup
=
scoped_cleanup
([
&
fa
](){
...
@@ -228,6 +232,7 @@ futexwake(futexkey_t key, u64 nwake)
...
@@ -228,6 +232,7 @@ futexwake(futexkey_t key, u64 nwake)
if
(
nwake
==
0
)
if
(
nwake
==
0
)
return
-
1
;
return
-
1
;
mtreadavar
(
"futex:ns:%lx"
,
key
);
{
{
scoped_gc_epoch
gc
;
scoped_gc_epoch
gc
;
fa
=
nsfutex
->
lookup
(
key
);
fa
=
nsfutex
->
lookup
(
key
);
...
@@ -238,6 +243,7 @@ futexwake(futexkey_t key, u64 nwake)
...
@@ -238,6 +243,7 @@ futexwake(futexkey_t key, u64 nwake)
auto
cleanup
=
scoped_cleanup
([
&
fa
](){
auto
cleanup
=
scoped_cleanup
([
&
fa
](){
fa
->
dec
();
fa
->
dec
();
});
});
mtwriteavar
(
"futex:%lx.%p"
,
key
,
fa
);
fa
->
nspid_
->
enumerate
([
&
nwoke
,
&
nwake
](
u32
pid
,
proc
*
p
)
{
fa
->
nspid_
->
enumerate
([
&
nwoke
,
&
nwake
](
u32
pid
,
proc
*
p
)
{
acquire
(
&
p
->
futex_lock
);
acquire
(
&
p
->
futex_lock
);
...
...
kernel/sysproc.cc
浏览文件 @
94a5fb99
...
@@ -178,6 +178,9 @@ sys_futex(const u64* addr, int op, u64 val, u64 timer)
...
@@ -178,6 +178,9 @@ sys_futex(const u64* addr, int op, u64 val, u64 timer)
if
(
futexkey
(
addr
,
myproc
()
->
vmap
,
&
key
)
<
0
)
if
(
futexkey
(
addr
,
myproc
()
->
vmap
,
&
key
)
<
0
)
return
-
1
;
return
-
1
;
mt_ascope
ascope
(
"%s(%p,%d,%lu,%lu)"
,
__func__
,
addr
,
op
,
val
,
timer
);
mtwriteavar
(
"thread:%x"
,
myproc
()
->
pid
);
switch
(
op
)
{
switch
(
op
)
{
case
FUTEX_WAIT
:
case
FUTEX_WAIT
:
return
futexwait
(
key
,
val
,
timer
);
return
futexwait
(
key
,
val
,
timer
);
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论