Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
ad87547f
提交
ad87547f
2月 23, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Wrap proc state setting and getting with functions
上级
693cfef8
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
41 行增加
和
27 行删除
+41
-27
proc.hh
include/proc.hh
+14
-1
condvar.cc
kernel/condvar.cc
+3
-3
idle.cc
kernel/idle.cc
+3
-3
proc.cc
kernel/proc.cc
+15
-14
sched.cc
kernel/sched.cc
+4
-4
trap.cc
kernel/trap.cc
+1
-1
sys_arch.cc
net/sys_arch.cc
+1
-1
没有找到文件。
include/proc.hh
浏览文件 @
ad87547f
...
@@ -38,7 +38,7 @@ struct proc {
...
@@ -38,7 +38,7 @@ struct proc {
struct
vmap
*
vmap
;
// va -> vma
struct
vmap
*
vmap
;
// va -> vma
uptr
brk
;
// Top of heap
uptr
brk
;
// Top of heap
char
*
kstack
;
// Bottom of kernel stack for this process
char
*
kstack
;
// Bottom of kernel stack for this process
enum
procstate
state
;
// Process state
enum
procstate
_state
;
// Process state
volatile
int
pid
;
// Process ID
volatile
int
pid
;
// Process ID
struct
proc
*
parent
;
// Parent process
struct
proc
*
parent
;
// Parent process
struct
trapframe
*
tf
;
// Trap frame for current syscall
struct
trapframe
*
tf
;
// Trap frame for current syscall
...
@@ -72,3 +72,16 @@ struct proc {
...
@@ -72,3 +72,16 @@ struct proc {
LIST_ENTRY
(
proc
)
cv_waiters
;
// Linked list of processes waiting for oncv
LIST_ENTRY
(
proc
)
cv_waiters
;
// Linked list of processes waiting for oncv
LIST_ENTRY
(
proc
)
cv_sleep
;
// Linked list of processes sleeping on a cv
LIST_ENTRY
(
proc
)
cv_sleep
;
// Linked list of processes sleeping on a cv
};
};
static
inline
void
set_proc_state
(
struct
proc
*
p
,
enum
procstate
s
)
{
p
->
_state
=
s
;
}
static
inline
enum
procstate
get_proc_state
(
struct
proc
*
p
)
{
return
p
->
_state
;
}
kernel/condvar.cc
浏览文件 @
ad87547f
...
@@ -82,7 +82,7 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout)
...
@@ -82,7 +82,7 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout)
LIST_INSERT_HEAD
(
&
cv
->
waiters
,
myproc
(),
cv_waiters
);
LIST_INSERT_HEAD
(
&
cv
->
waiters
,
myproc
(),
cv_waiters
);
myproc
()
->
oncv
=
cv
;
myproc
()
->
oncv
=
cv
;
myproc
()
->
state
=
SLEEPING
;
set_proc_state
(
myproc
(),
SLEEPING
)
;
if
(
timeout
)
{
if
(
timeout
)
{
acquire
(
&
sleepers_lock
);
acquire
(
&
sleepers_lock
);
...
@@ -115,9 +115,9 @@ cv_wakeup(struct condvar *cv)
...
@@ -115,9 +115,9 @@ cv_wakeup(struct condvar *cv)
acquire
(
&
cv
->
lock
);
acquire
(
&
cv
->
lock
);
LIST_FOREACH_SAFE
(
p
,
&
cv
->
waiters
,
cv_waiters
,
tmp
)
{
LIST_FOREACH_SAFE
(
p
,
&
cv
->
waiters
,
cv_waiters
,
tmp
)
{
acquire
(
&
p
->
lock
);
acquire
(
&
p
->
lock
);
if
(
p
->
state
!=
SLEEPING
)
if
(
get_proc_state
(
p
)
!=
SLEEPING
)
panic
(
"cv_wakeup: pid %u name %s state %u"
,
panic
(
"cv_wakeup: pid %u name %s state %u"
,
p
->
pid
,
p
->
name
,
p
->
state
);
p
->
pid
,
p
->
name
,
get_proc_state
(
p
)
);
if
(
p
->
oncv
!=
cv
)
if
(
p
->
oncv
!=
cv
)
panic
(
"cv_wakeup: pid %u name %s p->cv %p cv %p"
,
panic
(
"cv_wakeup: pid %u name %s p->cv %p cv %p"
,
p
->
pid
,
p
->
name
,
p
->
oncv
,
cv
);
p
->
pid
,
p
->
name
,
p
->
oncv
,
cv
);
...
...
kernel/idle.cc
浏览文件 @
ad87547f
...
@@ -38,7 +38,7 @@ idleloop(void)
...
@@ -38,7 +38,7 @@ idleloop(void)
struct
proc
*
p
=
schednext
();
struct
proc
*
p
=
schednext
();
if
(
p
)
{
if
(
p
)
{
acquire
(
&
p
->
lock
);
acquire
(
&
p
->
lock
);
if
(
p
->
state
!=
RUNNABLE
)
{
if
(
get_proc_state
(
p
)
!=
RUNNABLE
)
{
panic
(
"Huh?"
);
panic
(
"Huh?"
);
release
(
&
p
->
lock
);
release
(
&
p
->
lock
);
}
else
{
}
else
{
...
@@ -50,7 +50,7 @@ idleloop(void)
...
@@ -50,7 +50,7 @@ idleloop(void)
// before jumping back to us.
// before jumping back to us.
mycpu
()
->
proc
=
p
;
mycpu
()
->
proc
=
p
;
switchuvm
(
p
);
switchuvm
(
p
);
p
->
state
=
RUNNING
;
set_proc_state
(
p
,
RUNNING
)
;
p
->
tsc
=
rdtsc
();
p
->
tsc
=
rdtsc
();
mtpause
(
idlep
);
mtpause
(
idlep
);
...
@@ -69,7 +69,7 @@ idleloop(void)
...
@@ -69,7 +69,7 @@ idleloop(void)
// 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.
mycpu
()
->
proc
=
idlep
;
mycpu
()
->
proc
=
idlep
;
if
(
p
->
state
==
RUNNABLE
)
if
(
get_proc_state
(
p
)
==
RUNNABLE
)
addrun
(
p
);
addrun
(
p
);
release
(
&
p
->
lock
);
release
(
&
p
->
lock
);
}
}
...
...
kernel/proc.cc
浏览文件 @
ad87547f
...
@@ -41,13 +41,13 @@ sched(void)
...
@@ -41,13 +41,13 @@ sched(void)
#endif
#endif
if
(
mycpu
()
->
ncli
!=
1
)
if
(
mycpu
()
->
ncli
!=
1
)
panic
(
"sched locks"
);
panic
(
"sched locks"
);
if
(
myproc
()
->
state
==
RUNNING
)
if
(
get_proc_state
(
myproc
())
==
RUNNING
)
panic
(
"sched running"
);
panic
(
"sched running"
);
if
(
readrflags
()
&
FL_IF
)
if
(
readrflags
()
&
FL_IF
)
panic
(
"sched interruptible"
);
panic
(
"sched interruptible"
);
intena
=
mycpu
()
->
intena
;
intena
=
mycpu
()
->
intena
;
myproc
()
->
curcycles
+=
rdtsc
()
-
myproc
()
->
tsc
;
myproc
()
->
curcycles
+=
rdtsc
()
-
myproc
()
->
tsc
;
if
(
myproc
()
->
state
==
ZOMBIE
)
if
(
get_proc_state
(
myproc
())
==
ZOMBIE
)
mtstop
(
myproc
());
mtstop
(
myproc
());
else
else
mtpause
(
myproc
());
mtpause
(
myproc
());
...
@@ -62,7 +62,7 @@ void
...
@@ -62,7 +62,7 @@ void
yield
(
void
)
yield
(
void
)
{
{
acquire
(
&
myproc
()
->
lock
);
//DOC: yieldlock
acquire
(
&
myproc
()
->
lock
);
//DOC: yieldlock
myproc
()
->
state
=
RUNNABLE
;
set_proc_state
(
myproc
(),
RUNNABLE
)
;
sched
();
sched
();
release
(
&
myproc
()
->
lock
);
release
(
&
myproc
()
->
lock
);
}
}
...
@@ -120,7 +120,7 @@ exit(void)
...
@@ -120,7 +120,7 @@ exit(void)
SLIST_FOREACH_SAFE
(
p
,
&
(
myproc
()
->
childq
),
child_next
,
np
)
{
SLIST_FOREACH_SAFE
(
p
,
&
(
myproc
()
->
childq
),
child_next
,
np
)
{
acquire
(
&
p
->
lock
);
acquire
(
&
p
->
lock
);
p
->
parent
=
bootproc
;
p
->
parent
=
bootproc
;
if
(
p
->
state
==
ZOMBIE
)
if
(
get_proc_state
(
p
)
==
ZOMBIE
)
wakeupinit
=
1
;
wakeupinit
=
1
;
SLIST_REMOVE
(
&
(
myproc
()
->
childq
),
p
,
proc
,
child_next
);
SLIST_REMOVE
(
&
(
myproc
()
->
childq
),
p
,
proc
,
child_next
);
release
(
&
p
->
lock
);
release
(
&
p
->
lock
);
...
@@ -139,7 +139,7 @@ exit(void)
...
@@ -139,7 +139,7 @@ exit(void)
cv_wakeup
(
&
bootproc
->
cv
);
cv_wakeup
(
&
bootproc
->
cv
);
// Jump into the scheduler, never to return.
// Jump into the scheduler, never to return.
myproc
()
->
state
=
ZOMBIE
;
set_proc_state
(
myproc
(),
ZOMBIE
)
;
sched
();
sched
();
panic
(
"zombie exit"
);
panic
(
"zombie exit"
);
}
}
...
@@ -179,7 +179,7 @@ allocproc(void)
...
@@ -179,7 +179,7 @@ allocproc(void)
if
(
p
==
0
)
return
0
;
if
(
p
==
0
)
return
0
;
memset
(
p
,
0
,
sizeof
(
*
p
));
memset
(
p
,
0
,
sizeof
(
*
p
));
p
->
state
=
EMBRYO
;
set_proc_state
(
p
,
EMBRYO
)
;
p
->
pid
=
xnspid
->
allockey
();
p
->
pid
=
xnspid
->
allockey
();
p
->
cpuid
=
mycpu
()
->
id
;
p
->
cpuid
=
mycpu
()
->
id
;
p
->
on_runq
=
-
1
;
p
->
on_runq
=
-
1
;
...
@@ -353,7 +353,7 @@ kill(int pid)
...
@@ -353,7 +353,7 @@ kill(int pid)
}
}
acquire
(
&
p
->
lock
);
acquire
(
&
p
->
lock
);
p
->
killed
=
1
;
p
->
killed
=
1
;
if
(
p
->
state
==
SLEEPING
){
if
(
get_proc_state
(
p
)
==
SLEEPING
){
// XXX
// XXX
// we need to wake p up if it is cv_sleep()ing.
// we need to wake p up if it is cv_sleep()ing.
// can't change p from SLEEPING to RUNNABLE since that
// can't change p from SLEEPING to RUNNABLE since that
...
@@ -388,8 +388,9 @@ procdumpall(void)
...
@@ -388,8 +388,9 @@ procdumpall(void)
uptr
pc
[
10
];
uptr
pc
[
10
];
for
(
proc
*
p
:
xnspid
)
{
for
(
proc
*
p
:
xnspid
)
{
if
(
p
->
state
>=
0
&&
p
->
state
<
NELEM
(
states
)
&&
states
[
p
->
state
])
if
(
get_proc_state
(
p
)
>=
0
&&
get_proc_state
(
p
)
<
NELEM
(
states
)
&&
state
=
states
[
p
->
state
];
states
[
get_proc_state
(
p
)])
state
=
states
[
get_proc_state
(
p
)];
else
else
state
=
"???"
;
state
=
"???"
;
...
@@ -399,7 +400,7 @@ procdumpall(void)
...
@@ -399,7 +400,7 @@ procdumpall(void)
cprintf
(
"
\n
%-3d %-10s %8s %2u %lu
\n
"
,
cprintf
(
"
\n
%-3d %-10s %8s %2u %lu
\n
"
,
p
->
pid
,
name
,
state
,
p
->
cpuid
,
p
->
tsc
);
p
->
pid
,
name
,
state
,
p
->
cpuid
,
p
->
tsc
);
if
(
p
->
state
==
SLEEPING
){
if
(
get_proc_state
(
p
)
==
SLEEPING
){
getcallerpcs
((
void
*
)
p
->
context
->
rbp
,
pc
,
NELEM
(
pc
));
getcallerpcs
((
void
*
)
p
->
context
->
rbp
,
pc
,
NELEM
(
pc
));
for
(
int
i
=
0
;
i
<
10
&&
pc
[
i
]
!=
0
;
i
++
)
for
(
int
i
=
0
;
i
<
10
&&
pc
[
i
]
!=
0
;
i
++
)
cprintf
(
" %lx
\n
"
,
pc
[
i
]);
cprintf
(
" %lx
\n
"
,
pc
[
i
]);
...
@@ -428,7 +429,7 @@ fork(int flags)
...
@@ -428,7 +429,7 @@ fork(int flags)
if
((
np
->
vmap
=
myproc
()
->
vmap
->
copy
(
cow
))
==
0
){
if
((
np
->
vmap
=
myproc
()
->
vmap
->
copy
(
cow
))
==
0
){
ksfree
(
slab_stack
,
np
->
kstack
);
ksfree
(
slab_stack
,
np
->
kstack
);
np
->
kstack
=
0
;
np
->
kstack
=
0
;
np
->
state
=
UNUSED
;
set_proc_state
(
np
,
UNUSED
)
;
if
(
!
xnspid
->
remove
(
np
->
pid
,
&
np
))
if
(
!
xnspid
->
remove
(
np
->
pid
,
&
np
))
panic
(
"fork: ns_remove"
);
panic
(
"fork: ns_remove"
);
freeproc
(
np
);
freeproc
(
np
);
...
@@ -489,7 +490,7 @@ wait(void)
...
@@ -489,7 +490,7 @@ wait(void)
SLIST_FOREACH_SAFE
(
p
,
&
myproc
()
->
childq
,
child_next
,
np
)
{
SLIST_FOREACH_SAFE
(
p
,
&
myproc
()
->
childq
,
child_next
,
np
)
{
havekids
=
1
;
havekids
=
1
;
acquire
(
&
p
->
lock
);
acquire
(
&
p
->
lock
);
if
(
p
->
state
==
ZOMBIE
){
if
(
get_proc_state
(
p
)
==
ZOMBIE
){
release
(
&
p
->
lock
);
// noone else better be trying to lock p
release
(
&
p
->
lock
);
// noone else better be trying to lock p
pid
=
p
->
pid
;
pid
=
p
->
pid
;
SLIST_REMOVE
(
&
myproc
()
->
childq
,
p
,
proc
,
child_next
);
SLIST_REMOVE
(
&
myproc
()
->
childq
,
p
,
proc
,
child_next
);
...
@@ -497,7 +498,7 @@ wait(void)
...
@@ -497,7 +498,7 @@ wait(void)
ksfree
(
slab_stack
,
p
->
kstack
);
ksfree
(
slab_stack
,
p
->
kstack
);
p
->
kstack
=
0
;
p
->
kstack
=
0
;
p
->
vmap
->
decref
();
p
->
vmap
->
decref
();
p
->
state
=
UNUSED
;
set_proc_state
(
p
,
UNUSED
)
;
if
(
!
xnspid
->
remove
(
p
->
pid
,
&
p
))
if
(
!
xnspid
->
remove
(
p
->
pid
,
&
p
))
panic
(
"wait: ns_remove"
);
panic
(
"wait: ns_remove"
);
p
->
pid
=
0
;
p
->
pid
=
0
;
...
@@ -568,7 +569,7 @@ threadpin(void (*fn)(void*), void *arg, const char *name, int cpu)
...
@@ -568,7 +569,7 @@ threadpin(void (*fn)(void*), void *arg, const char *name, int cpu)
p
->
cpuid
=
cpu
;
p
->
cpuid
=
cpu
;
p
->
cpu_pin
=
1
;
p
->
cpu_pin
=
1
;
acquire
(
&
p
->
lock
);
acquire
(
&
p
->
lock
);
p
->
state
=
RUNNABLE
;
set_proc_state
(
p
,
RUNNABLE
)
;
addrun
(
p
);
addrun
(
p
);
release
(
&
p
->
lock
);
release
(
&
p
->
lock
);
}
}
kernel/sched.cc
浏览文件 @
ad87547f
...
@@ -29,7 +29,7 @@ addrun(struct proc *p)
...
@@ -29,7 +29,7 @@ addrun(struct proc *p)
// Always called with p->lock held
// Always called with p->lock held
struct
runq
*
q
;
struct
runq
*
q
;
p
->
state
=
RUNNABLE
;
set_proc_state
(
p
,
RUNNABLE
)
;
q
=
&
runq
[
p
->
cpuid
];
q
=
&
runq
[
p
->
cpuid
];
acquire
(
&
q
->
lock
);
acquire
(
&
q
->
lock
);
...
@@ -71,7 +71,7 @@ steal(void)
...
@@ -71,7 +71,7 @@ steal(void)
if
(
tryacquire
(
&
q
->
lock
)
==
0
)
if
(
tryacquire
(
&
q
->
lock
)
==
0
)
continue
;
continue
;
STAILQ_FOREACH
(
p
,
&
q
->
q
,
runqlink
)
{
STAILQ_FOREACH
(
p
,
&
q
->
q
,
runqlink
)
{
if
(
p
->
state
==
RUNNABLE
&&
!
p
->
cpu_pin
&&
if
(
get_proc_state
(
p
)
==
RUNNABLE
&&
!
p
->
cpu_pin
&&
p
->
curcycles
!=
0
&&
p
->
curcycles
>
VICTIMAGE
)
p
->
curcycles
!=
0
&&
p
->
curcycles
>
VICTIMAGE
)
{
{
STAILQ_REMOVE
(
&
q
->
q
,
p
,
proc
,
runqlink
);
STAILQ_REMOVE
(
&
q
->
q
,
p
,
proc
,
runqlink
);
...
@@ -83,7 +83,7 @@ steal(void)
...
@@ -83,7 +83,7 @@ steal(void)
if
(
steal
)
{
if
(
steal
)
{
acquire
(
&
steal
->
lock
);
acquire
(
&
steal
->
lock
);
if
(
steal
->
state
==
RUNNABLE
&&
!
steal
->
cpu_pin
&&
if
(
get_proc_state
(
steal
)
==
RUNNABLE
&&
!
steal
->
cpu_pin
&&
steal
->
curcycles
!=
0
&&
steal
->
curcycles
>
VICTIMAGE
)
steal
->
curcycles
!=
0
&&
steal
->
curcycles
>
VICTIMAGE
)
{
{
//delrun(steal);
//delrun(steal);
...
@@ -94,7 +94,7 @@ steal(void)
...
@@ -94,7 +94,7 @@ steal(void)
r
=
1
;
r
=
1
;
break
;
break
;
}
}
if
(
steal
->
state
==
RUNNABLE
)
if
(
get_proc_state
(
steal
)
==
RUNNABLE
)
addrun
(
steal
);
addrun
(
steal
);
release
(
&
steal
->
lock
);
release
(
&
steal
->
lock
);
}
}
...
...
kernel/trap.cc
浏览文件 @
ad87547f
...
@@ -152,7 +152,7 @@ trap(struct trapframe *tf)
...
@@ -152,7 +152,7 @@ trap(struct trapframe *tf)
// Force process to give up CPU on clock tick.
// Force process to give up CPU on clock tick.
// If interrupts were on while locks held, would need to check nlock.
// If interrupts were on while locks held, would need to check nlock.
if
(
myproc
()
&&
myproc
()
->
state
==
RUNNING
&&
tf
->
trapno
==
T_IRQ0
+
IRQ_TIMER
)
if
(
myproc
()
&&
get_proc_state
(
myproc
())
==
RUNNING
&&
tf
->
trapno
==
T_IRQ0
+
IRQ_TIMER
)
yield
();
yield
();
// Check if the process has been killed since we yielded
// Check if the process has been killed since we yielded
...
...
net/sys_arch.cc
浏览文件 @
ad87547f
...
@@ -220,7 +220,7 @@ sys_thread_new(const char *name, lwip_thread_fn thread, void *arg,
...
@@ -220,7 +220,7 @@ sys_thread_new(const char *name, lwip_thread_fn thread, void *arg,
safestrcpy
(
p
->
name
,
name
,
sizeof
(
p
->
name
));
safestrcpy
(
p
->
name
,
name
,
sizeof
(
p
->
name
));
acquire
(
&
p
->
lock
);
acquire
(
&
p
->
lock
);
p
->
state
=
RUNNABLE
;
set_proc_state
(
p
,
RUNNABLE
)
;
addrun
(
p
);
addrun
(
p
);
release
(
&
p
->
lock
);
release
(
&
p
->
lock
);
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论