Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
e661e06a
提交
e661e06a
5月 19, 2011
创建
作者:
Robert Morris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
passes all usertests
BUT can't figure out how to fix bad kill()/condvar interaction
上级
ebba3c91
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
38 行增加
和
20 行删除
+38
-20
condvar.c
condvar.c
+11
-10
proc.c
proc.c
+23
-7
proc.h
proc.h
+2
-1
usertests.c
usertests.c
+2
-2
没有找到文件。
condvar.c
浏览文件 @
e661e06a
...
...
@@ -29,18 +29,17 @@ cv_sleep(struct condvar *cv, struct spinlock *lk)
release
(
lk
);
if
(
proc
->
cv_next
)
panic
(
"cv_sleep cv_next"
);
acquire
(
&
proc
->
lock
);
if
(
proc
->
cv_next
||
proc
->
oncv
)
panic
(
"cv_sleep cv_next"
);
proc
->
cv_next
=
cv
->
waiters
;
cv
->
waiters
=
proc
;
acquire
(
&
proc
->
lock
)
;
proc
->
state
=
SLEEPING
;
proc
->
oncv
=
cv
;
release
(
&
cv
->
lock
);
proc
->
state
=
SLEEPING
;
sched
();
release
(
&
proc
->
lock
);
...
...
@@ -55,11 +54,13 @@ cv_wakeup(struct condvar *cv)
{
acquire
(
&
cv
->
lock
);
while
(
cv
->
waiters
)
{
if
(
cv
->
waiters
->
state
!=
SLEEPING
)
struct
proc
*
p
=
cv
->
waiters
;
if
(
p
->
state
!=
SLEEPING
||
p
->
oncv
!=
cv
)
panic
(
"cv_wakeup"
);
struct
proc
*
nxt
=
cv
->
waiters
->
cv_next
;
cv
->
waiters
->
cv_next
=
0
;
addrun
(
cv
->
waiters
);
struct
proc
*
nxt
=
p
->
cv_next
;
p
->
cv_next
=
0
;
p
->
oncv
=
0
;
addrun
(
p
);
cv
->
waiters
=
nxt
;
}
release
(
&
cv
->
lock
);
...
...
proc.c
浏览文件 @
e661e06a
...
...
@@ -168,13 +168,22 @@ userinit(void)
addrun
(
p
);
}
// Grow current process's memory by n bytes.
// Grow/shrink current process's memory by n bytes.
// Growing may allocate vmas and physical memory,
// but avoids interfering with any existing vma.
// Assumes vmas around proc->brk are part of the growable heap.
// Shrinking just decreases proc->brk; doesn't deallocate.
// Return 0 on success, -1 on failure.
int
growproc
(
int
n
)
{
struct
vmap
*
m
=
proc
->
vmap
;
if
(
n
<
0
&&
0
-
n
<=
proc
->
brk
){
proc
->
brk
+=
n
;
return
0
;
}
if
(
n
<
0
||
n
>
USERTOP
||
proc
->
brk
+
n
>
USERTOP
)
return
-
1
;
...
...
@@ -549,16 +558,23 @@ kill(int pid)
acquire
(
&
p
->
lock
);
if
(
p
->
pid
==
pid
){
p
->
killed
=
1
;
// Wake process from sleep if necessary.
if
(
p
->
state
==
SLEEPING
)
{
p
->
state
=
RUNNABLE
;
STAILQ_INSERT_TAIL
(
&
runq
->
runq
,
p
,
run_next
);
}
if
(
p
->
state
==
SLEEPING
){
// XXX
// we need to wake p up if it is cv_sleep()ing.
// can't change p from SLEEPING to RUNNABLE since that
// would make some condvar->waiters a dangling reference,
// and the non-zero p->cv_next will cause a future panic.
// can't call cv_wakeup(p->oncv) since that results in
// deadlock (addrun() acquires p->lock).
// can't release p->lock then call cv_wakeup() since the
// cv might be deallocated while we're using it
// (pipes dynamically allocate condvars).
}
release
(
&
p
->
lock
);
release
(
&
ptables
[
c
].
lock
);
return
0
;
}
acquir
e
(
&
p
->
lock
);
releas
e
(
&
p
->
lock
);
}
release
(
&
ptables
[
c
].
lock
);
}
...
...
proc.h
浏览文件 @
e661e06a
...
...
@@ -75,7 +75,8 @@ struct proc {
struct
proc
*
parent
;
// Parent process
struct
trapframe
*
tf
;
// Trap frame for current syscall
struct
context
*
context
;
// swtch() here to run process
struct
proc
*
cv_next
;
// Linked list of processes waiting for condvar
struct
condvar
*
oncv
;
// Where it is sleeping, for kill()
struct
proc
*
cv_next
;
// Linked list of processes waiting for oncv
int
killed
;
// If non-zero, have been killed
struct
file
*
ofile
[
NOFILE
];
// Open files
struct
inode
*
cwd
;
// Current directory
...
...
usertests.c
浏览文件 @
e661e06a
...
...
@@ -1290,7 +1290,6 @@ sbrktest(void)
exit
();
}
#if 0
// can one de-allocate?
a
=
sbrk
(
0
);
c
=
sbrk
(
-
4096
);
...
...
@@ -1311,6 +1310,7 @@ sbrktest(void)
printf
(
stdout
,
"sbrk re-allocation failed, a %x c %x
\n
"
,
a
,
c
);
exit
();
}
#if 0
if(*lastaddr == 99){
// should be zero
printf(stdout, "sbrk de-allocation didn't really deallocate\n");
...
...
@@ -1477,7 +1477,7 @@ main(int argc, char *argv[])
bigargtest
();
bsstest
();
//
sbrktest();
sbrktest
();
validatetest
();
opentest
();
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论