Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
ebba3c91
提交
ebba3c91
5月 19, 2011
创建
作者:
Robert Morris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
pipe.c uses condvars; that was the last use of sleep/wakeup
list of sleepers per condvar
上级
ba45ab30
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
22 行增加
和
32 行删除
+22
-32
condvar.c
condvar.c
+12
-5
defs.h
defs.h
+0
-2
pipe.c
pipe.c
+8
-7
proc.c
proc.c
+0
-16
proc.h
proc.h
+1
-1
usertests.c
usertests.c
+1
-1
没有找到文件。
condvar.c
浏览文件 @
ebba3c91
...
...
@@ -12,6 +12,7 @@ void
initcondvar
(
struct
condvar
*
cv
,
char
*
n
)
{
initlock
(
&
cv
->
lock
,
n
);
cv
->
waiters
=
0
;
}
void
...
...
@@ -28,10 +29,11 @@ cv_sleep(struct condvar *cv, struct spinlock *lk)
release
(
lk
);
if
(
cv
->
waiters
!=
0
)
panic
(
"cv_sleep
\n
"
);
if
(
proc
->
cv_next
)
panic
(
"cv_sleep
cv_next
"
);
cv
->
waiters
=
proc
;
// XXX should be queue
proc
->
cv_next
=
cv
->
waiters
;
cv
->
waiters
=
proc
;
acquire
(
&
proc
->
lock
);
...
...
@@ -47,13 +49,18 @@ cv_sleep(struct condvar *cv, struct spinlock *lk)
acquire
(
lk
);
}
// Wake up all processes sleeping on this condvar.
void
cv_wakeup
(
struct
condvar
*
cv
)
{
acquire
(
&
cv
->
lock
);
if
(
cv
->
waiters
!=
0
)
{
while
(
cv
->
waiters
)
{
if
(
cv
->
waiters
->
state
!=
SLEEPING
)
panic
(
"cv_wakeup"
);
struct
proc
*
nxt
=
cv
->
waiters
->
cv_next
;
cv
->
waiters
->
cv_next
=
0
;
addrun
(
cv
->
waiters
);
cv
->
waiters
=
0
;
cv
->
waiters
=
nxt
;
}
release
(
&
cv
->
lock
);
}
defs.h
浏览文件 @
ebba3c91
...
...
@@ -115,8 +115,6 @@ void sched(void);
void
userinit
(
void
);
int
wait
(
void
);
void
yield
(
void
);
void
wakeup
(
void
*
);
void
sleep
(
void
*
,
struct
spinlock
*
);
// swtch.S
void
swtch
(
struct
context
**
,
struct
context
*
);
...
...
pipe.c
浏览文件 @
ebba3c91
...
...
@@ -13,6 +13,7 @@
struct
pipe
{
struct
spinlock
lock
;
struct
condvar
cv
;
char
data
[
PIPESIZE
];
uint
nread
;
// number of bytes read
uint
nwrite
;
// number of bytes written
...
...
@@ -36,6 +37,7 @@ pipealloc(struct file **f0, struct file **f1)
p
->
nwrite
=
0
;
p
->
nread
=
0
;
initlock
(
&
p
->
lock
,
"pipe"
);
initcondvar
(
&
p
->
cv
,
"pipe"
);
(
*
f0
)
->
type
=
FD_PIPE
;
(
*
f0
)
->
readable
=
1
;
(
*
f0
)
->
writable
=
0
;
...
...
@@ -63,11 +65,10 @@ pipeclose(struct pipe *p, int writable)
acquire
(
&
p
->
lock
);
if
(
writable
){
p
->
writeopen
=
0
;
wakeup
(
&
p
->
nread
);
}
else
{
p
->
readopen
=
0
;
wakeup
(
&
p
->
nwrite
);
}
cv_wakeup
(
&
p
->
cv
);
if
(
p
->
readopen
==
0
&&
p
->
writeopen
==
0
){
release
(
&
p
->
lock
);
kfree
((
char
*
)
p
);
...
...
@@ -88,12 +89,12 @@ pipewrite(struct pipe *p, char *addr, int n)
release
(
&
p
->
lock
);
return
-
1
;
}
wakeup
(
&
p
->
nread
);
sleep
(
&
p
->
nwrite
,
&
p
->
lock
);
//DOC: pipewrite-sleep
cv_wakeup
(
&
p
->
cv
);
cv_sleep
(
&
p
->
cv
,
&
p
->
lock
);
//DOC: pipewrite-sleep
}
p
->
data
[
p
->
nwrite
++
%
PIPESIZE
]
=
addr
[
i
];
}
wakeup
(
&
p
->
nread
);
//DOC: pipewrite-wakeup1
cv_wakeup
(
&
p
->
cv
);
//DOC: pipewrite-wakeup1
release
(
&
p
->
lock
);
return
n
;
}
...
...
@@ -109,14 +110,14 @@ piperead(struct pipe *p, char *addr, int n)
release
(
&
p
->
lock
);
return
-
1
;
}
sleep
(
&
p
->
nread
,
&
p
->
lock
);
//DOC: piperead-sleep
cv_sleep
(
&
p
->
cv
,
&
p
->
lock
);
//DOC: piperead-sleep
}
for
(
i
=
0
;
i
<
n
;
i
++
){
//DOC: piperead-copy
if
(
p
->
nread
==
p
->
nwrite
)
break
;
addr
[
i
]
=
p
->
data
[
p
->
nread
++
%
PIPESIZE
];
}
wakeup
(
&
p
->
nwrite
);
//DOC: piperead-wakeup
cv_wakeup
(
&
p
->
cv
);
//DOC: piperead-wakeup
release
(
&
p
->
lock
);
return
i
;
}
proc.c
浏览文件 @
ebba3c91
...
...
@@ -621,19 +621,3 @@ procdumpall(void)
procdump
(
c
);
}
}
//// dead code
// Atomically release lock and sleep on chan.
// Reacquires lock when awakened.
void
sleep
(
void
*
chan
,
struct
spinlock
*
lk
)
{
panic
(
"sleep"
);
}
// Wake up all processes sleeping on chan.
void
wakeup
(
void
*
chan
)
{
}
proc.h
浏览文件 @
ebba3c91
...
...
@@ -75,7 +75,7 @@ struct proc {
struct
proc
*
parent
;
// Parent process
struct
trapframe
*
tf
;
// Trap frame for current syscall
struct
context
*
context
;
// swtch() here to run process
void
*
chan
;
// If non-zero, sleeping on chan
struct
proc
*
cv_next
;
// Linked list of processes waiting for condvar
int
killed
;
// If non-zero, have been killed
struct
file
*
ofile
[
NOFILE
];
// Open files
struct
inode
*
cwd
;
// Current directory
...
...
usertests.c
浏览文件 @
ebba3c91
...
...
@@ -1477,7 +1477,7 @@ main(int argc, char *argv[])
bigargtest
();
bsstest
();
sbrktest
();
//
sbrktest();
validatetest
();
opentest
();
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论