Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
e31c700a
提交
e31c700a
2月 15, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
lambda-oriented foreach
上级
b8b64da4
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
45 行增加
和
65 行删除
+45
-65
crange.cc
crange.cc
+0
-10
crange.hh
crange.hh
+8
-1
vm.cc
vm.cc
+37
-54
没有找到文件。
crange.cc
浏览文件 @
e31c700a
...
...
@@ -607,13 +607,3 @@ void crange::add(u64 k, u64 sz, void *v)
this
->
check
(
nullptr
);
gc_end_epoch
();
}
int
crange
::
foreach
(
int
(
*
cb
)(
range
*
r
,
void
*
),
void
*
st
)
{
struct
range
*
e
;
for
(
e
=
crange_head
->
next
[
0
].
ptr
();
e
;
e
=
e
->
next
[
0
].
ptr
())
{
if
(
!
cb
(
e
,
st
))
return
0
;
}
return
1
;
}
crange.hh
浏览文件 @
e31c700a
...
...
@@ -113,12 +113,19 @@ public:
void
del
(
u64
k
,
u64
sz
);
void
add
(
u64
k
,
u64
sz
,
void
*
v
);
range
*
search
(
u64
k
,
u64
sz
,
int
mod
);
int
foreach
(
int
(
*
cb
)(
range
*
r
,
void
*
),
void
*
st
);
void
print
(
int
);
void
check
(
struct
range
*
absent
);
int
del_index
(
range
*
p0
,
range
**
e
,
int
l
);
void
add_index
(
int
l
,
range
*
e
,
range
*
p1
,
markptr
<
range
>
s1
);
int
lock_range
(
u64
k
,
u64
sz
,
int
l
,
range
**
er
,
range
**
pr
,
range
**
fr
,
range
**
lr
,
range
**
sr
);
int
find_and_lock
(
u64
k
,
u64
sz
,
range
**
p0
,
range
**
f0
,
range
**
l0
,
range
**
s0
);
template
<
class
CB
>
bool
foreach
(
CB
cb
)
{
for
(
range
*
e
=
crange_head
->
next
[
0
].
ptr
();
e
;
e
=
e
->
next
[
0
].
ptr
())
if
(
!
cb
(
e
))
return
false
;
return
true
;
}
};
vm.cc
浏览文件 @
e31c700a
...
...
@@ -307,25 +307,15 @@ vmn_alloc(u64 npg, enum vmntype type)
}
#ifdef TREE
struct
state
{
int
share
;
pml4e_t
*
pml4
;
struct
crange
*
cr
;
};
static
int
vmap_free_vma
(
range
*
r
,
void
*
st
)
{
delete
(
vma
*
)
r
->
value
;
r
->
cr
->
del
(
r
->
key
,
r
->
size
);
return
1
;
}
static
void
vmap_free
(
void
*
p
)
{
struct
vmap
*
m
=
(
struct
vmap
*
)
p
;
m
->
cr
->
foreach
(
vmap_free_vma
,
NULL
);
m
->
cr
->
foreach
([](
range
*
r
)
{
delete
(
vma
*
)
r
->
value
;
r
->
cr
->
del
(
r
->
key
,
r
->
size
);
return
true
;
});
delete
m
->
cr
;
ksfree
(
slab_kshared
,
m
->
kshared
);
freevm
(
m
->
pml4
);
...
...
@@ -386,50 +376,43 @@ vmap_insert(struct vmap *m, struct vmnode *n, uptr va_start)
return
0
;
}
static
int
vmap_copy_vma
(
struct
range
*
r
,
void
*
_st
)
{
struct
state
*
st
=
(
struct
state
*
)
_st
;
struct
vma
*
e
=
(
struct
vma
*
)
r
->
value
;
struct
vma
*
c
=
new
vma
();
if
(
c
==
0
)
{
return
0
;
}
c
->
va_start
=
e
->
va_start
;
c
->
va_end
=
e
->
va_end
;
if
(
st
->
share
)
{
c
->
n
=
e
->
n
;
c
->
va_type
=
COW
;
acquire
(
&
e
->
lock
);
e
->
va_type
=
COW
;
updatepages
(
st
->
pml4
,
(
void
*
)
(
e
->
va_start
),
(
void
*
)
(
e
->
va_end
),
PTE_COW
);
release
(
&
e
->
lock
);
}
else
{
c
->
n
=
vmn_copy
(
e
->
n
);
c
->
va_type
=
e
->
va_type
;
}
if
(
c
->
n
==
0
)
{
return
0
;
}
c
->
n
->
ref
++
;
st
->
cr
->
add
(
c
->
va_start
,
c
->
va_end
-
c
->
va_start
,
(
void
*
)
c
);
return
1
;
}
struct
vmap
*
vmap_copy
(
struct
vmap
*
m
,
int
share
)
{
struct
vmap
*
c
=
vmap_alloc
();
if
(
c
==
0
)
struct
vmap
*
nm
=
vmap_alloc
();
if
(
nm
==
0
)
return
0
;
acquire
(
&
m
->
lock
);
struct
state
st
;
st
.
share
=
share
;
st
.
pml4
=
m
->
pml4
;
st
.
cr
=
c
->
cr
;
if
(
!
m
->
cr
->
foreach
(
vmap_copy_vma
,
&
st
))
{
vmap_free
(
c
);
if
(
!
m
->
cr
->
foreach
([
share
,
m
,
nm
](
range
*
r
)
->
bool
{
struct
vma
*
e
=
(
struct
vma
*
)
r
->
value
;
struct
vma
*
ne
=
new
vma
();
if
(
ne
==
0
)
return
false
;
ne
->
va_start
=
e
->
va_start
;
ne
->
va_end
=
e
->
va_end
;
if
(
share
)
{
ne
->
n
=
e
->
n
;
ne
->
va_type
=
COW
;
acquire
(
&
e
->
lock
);
e
->
va_type
=
COW
;
updatepages
(
m
->
pml4
,
(
void
*
)
(
e
->
va_start
),
(
void
*
)
(
e
->
va_end
),
PTE_COW
);
release
(
&
e
->
lock
);
}
else
{
ne
->
n
=
vmn_copy
(
e
->
n
);
ne
->
va_type
=
e
->
va_type
;
}
if
(
ne
->
n
==
0
)
return
false
;
ne
->
n
->
ref
++
;
nm
->
cr
->
add
(
ne
->
va_start
,
ne
->
va_end
-
ne
->
va_start
,
(
void
*
)
ne
);
return
true
;
}))
{
vmap_free
(
nm
);
release
(
&
m
->
lock
);
return
0
;
}
...
...
@@ -438,7 +421,7 @@ vmap_copy(struct vmap *m, int share)
lcr3
(
v2p
(
m
->
pml4
));
// Reload hardware page table
release
(
&
m
->
lock
);
return
c
;
return
nm
;
}
int
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论