Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
eddb2693
提交
eddb2693
2月 24, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
one less pushcli/popcli
上级
83ec933a
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
9 行增加
和
9 行删除
+9
-9
proc.hh
include/proc.hh
+2
-2
gc.cc
kernel/gc.cc
+7
-7
没有找到文件。
include/proc.hh
浏览文件 @
eddb2693
...
...
@@ -57,9 +57,9 @@ struct proc : public rcu_freed {
SLIST_HEAD
(
childlist
,
proc
)
childq
;
SLIST_ENTRY
(
proc
)
child_next
;
struct
condvar
cv
;
u64
epoch
;
std
::
atomic
<
u64
>
epoch
;
struct
spinlock
gc_epoch_lock
;
u64
epoch_depth
;
std
::
atomic
<
u64
>
epoch_depth
;
char
lockname
[
16
];
int
on_runq
;
int
cpu_pin
;
...
...
kernel/gc.cc
浏览文件 @
eddb2693
...
...
@@ -138,7 +138,7 @@ gc_delayfreelist(void)
// p->epoch, so gc_thread does it for them. XXX get rid off lock?
acquire
(
&
p
->
gc_epoch_lock
);
if
(
p
->
epoch_depth
==
0
)
p
->
epoch
=
global_epoch
;
p
->
epoch
=
global_epoch
.
load
()
;
release
(
&
p
->
gc_epoch_lock
);
// cprintf("gc_min %d(%s): %lu %ld\n", p->pid, p->name, p->epoch, p->epoch_depth);
if
(
min
>
p
->
epoch
)
...
...
@@ -155,9 +155,9 @@ gc_delayfreelist(void)
void
gc_delayed
(
rcu_freed
*
e
)
{
gc_state
[
mycpu
()
->
id
].
ndelayed
++
;
pushcli
();
int
c
=
mycpu
()
->
id
;
gc_state
[
c
].
ndelayed
++
;
u64
myepoch
=
myproc
()
->
epoch
;
u64
minepoch
=
gc_state
[
c
].
delayed
[
myepoch
%
NEPOCH
].
epoch
;
if
(
gc_debug
)
...
...
@@ -170,7 +170,6 @@ gc_delayed(rcu_freed *e)
e
->
_rcu_epoch
=
myepoch
;
e
->
_rcu_next
=
gc_state
[
c
].
delayed
[
myepoch
%
NEPOCH
].
head
;
while
(
!
cmpxch_update
(
&
gc_state
[
c
].
delayed
[
myepoch
%
NEPOCH
].
head
,
&
e
->
_rcu_next
,
e
))
{}
popcli
();
}
void
...
...
@@ -180,9 +179,10 @@ gc_begin_epoch(void)
acquire
(
&
myproc
()
->
gc_epoch_lock
);
if
(
myproc
()
->
epoch_depth
++
>
0
)
goto
done
;
myproc
()
->
epoch
=
global_epoch
;
// not atomic, but it never goes backwards
myproc
()
->
epoch
=
global_epoch
.
load
()
;
// not atomic, but it never goes backwards
// __sync_synchronize();
done:
(
void
)
0
;
release
(
&
myproc
()
->
gc_epoch_lock
);
}
...
...
@@ -221,7 +221,7 @@ gc_worker(void *x)
release
(
&
wl
);
gc_state
[
mycpu
()
->
id
].
nrun
++
;
u64
global
=
global_epoch
;
myproc
()
->
epoch
=
global_epoch
;
// move the gc thread to next epoch
myproc
()
->
epoch
=
global_epoch
.
load
()
;
// move the gc thread to next epoch
for
(
i
=
gc_state
[
mycpu
()
->
id
].
min_epoch
;
i
<
global
-
2
;
i
++
)
{
int
nfree
=
gc_free_tofreelist
(
&
gc_state
[
mycpu
()
->
id
].
tofree
[
i
%
NEPOCH
].
head
,
i
);
gc_state
[
mycpu
()
->
id
].
tofree
[
i
%
NEPOCH
].
epoch
+=
NEPOCH
;
...
...
@@ -239,7 +239,7 @@ gc_worker(void *x)
void
initprocgc
(
struct
proc
*
p
)
{
p
->
epoch
=
global_epoch
;
p
->
epoch
=
global_epoch
.
load
()
;
p
->
epoch_depth
=
0
;
initlock
(
&
p
->
gc_epoch_lock
,
"per process gc_lock"
,
0
);
}
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论