Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
d6952037
提交
d6952037
6月 12, 2011
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
allow rcu in scheduler kthread
上级
1229ed4b
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
12 行增加
和
8 行删除
+12
-8
proc.c
proc.c
+10
-6
rcu.c
rcu.c
+2
-2
没有找到文件。
proc.c
浏览文件 @
d6952037
...
@@ -488,13 +488,17 @@ void
...
@@ -488,13 +488,17 @@ void
scheduler
(
void
)
scheduler
(
void
)
{
{
struct
proc
*
p
;
struct
proc
*
p
;
int
pid
;
pid
=
ns_allockey
(
nspid
);
// allocate a fake PID for each scheduler thread
struct
proc
*
schedp
=
allocproc
();
if
(
!
schedp
)
panic
(
"scheduler allocproc"
);
proc
=
schedp
;
// Enabling mtrace calls in scheduler generates many mtrace_call_entrys.
// Enabling mtrace calls in scheduler generates many mtrace_call_entrys.
// mtrace_call_set(1, cpu->id);
// mtrace_call_set(1, cpu->id);
mtrace_fcall_register
(
pid
,
(
unsigned
long
)
scheduler
,
0
,
mtrace_start
);
mtrace_fcall_register
(
schedp
->
pid
,
(
unsigned
long
)
scheduler
,
0
,
mtrace_start
);
for
(;;){
for
(;;){
// Enable interrupts on this processor.
// Enable interrupts on this processor.
...
@@ -524,17 +528,17 @@ scheduler(void)
...
@@ -524,17 +528,17 @@ scheduler(void)
p
->
state
=
RUNNING
;
p
->
state
=
RUNNING
;
p
->
tsc
=
rdtsc
();
p
->
tsc
=
rdtsc
();
mtrace_fcall_register
(
pid
,
0
,
0
,
mtrace_pause
);
mtrace_fcall_register
(
schedp
->
pid
,
0
,
0
,
mtrace_pause
);
mtrace_fcall_register
(
proc
->
pid
,
0
,
0
,
mtrace_resume
);
mtrace_fcall_register
(
proc
->
pid
,
0
,
0
,
mtrace_resume
);
mtrace_call_set
(
1
,
cpu
->
id
);
mtrace_call_set
(
1
,
cpu
->
id
);
swtch
(
&
cpu
->
scheduler
,
proc
->
context
);
swtch
(
&
cpu
->
scheduler
,
proc
->
context
);
mtrace_fcall_register
(
pid
,
0
,
0
,
mtrace_resume
);
mtrace_fcall_register
(
schedp
->
pid
,
0
,
0
,
mtrace_resume
);
mtrace_call_set
(
0
,
cpu
->
id
);
mtrace_call_set
(
0
,
cpu
->
id
);
switchkvm
();
switchkvm
();
// Process is done running for now.
// Process is done running for now.
// It should have changed its p->state before coming back.
// It should have changed its p->state before coming back.
proc
=
0
;
proc
=
schedp
;
release
(
&
p
->
lock
);
release
(
&
p
->
lock
);
break
;
break
;
}
}
...
...
rcu.c
浏览文件 @
d6952037
...
@@ -97,7 +97,7 @@ rcu_delayed(void *e, void (*dofree)(void *))
...
@@ -97,7 +97,7 @@ rcu_delayed(void *e, void (*dofree)(void *))
void
void
rcu_begin_read
(
void
)
rcu_begin_read
(
void
)
{
{
if
(
proc
->
rcu_read_depth
++
==
0
)
if
(
proc
&&
proc
->
rcu_read_depth
++
==
0
)
proc
->
epoch
=
global_epoch
;
proc
->
epoch
=
global_epoch
;
__sync_synchronize
();
__sync_synchronize
();
}
}
...
@@ -105,7 +105,7 @@ rcu_begin_read(void)
...
@@ -105,7 +105,7 @@ rcu_begin_read(void)
void
void
rcu_end_read
(
void
)
rcu_end_read
(
void
)
{
{
if
(
--
proc
->
rcu_read_depth
==
0
)
if
(
proc
&&
proc
->
rcu_read_depth
>
0
&&
--
proc
->
rcu_read_depth
==
0
)
proc
->
epoch
=
INF
;
proc
->
epoch
=
INF
;
}
}
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论