Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
39fa2be7
提交
39fa2be7
2月 15, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
range-based for loop seems a better fit for iterating over crange
上级
e31c700a
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
40 行增加
和
22 行删除
+40
-22
crange.hh
crange.hh
+28
-10
vm.cc
vm.cc
+12
-12
没有找到文件。
crange.hh
浏览文件 @
39fa2be7
...
...
@@ -83,7 +83,7 @@ class markptr_mark : public markptr<T> {
};
struct
range
:
public
rcu_freed
{
public
:
public
:
u64
key
;
u64
size
;
void
*
value
;
...
...
@@ -103,10 +103,22 @@ public:
int
lockif
(
markptr
<
range
>
e
);
}
__mpalign__
;
class
range_iterator
{
private
:
range
*
_e
;
public
:
range_iterator
(
range
*
e
)
:
_e
(
e
)
{}
range_iterator
&
operator
++
()
{
_e
=
_e
->
next
[
0
].
ptr
();
return
*
this
;
}
range
*&
operator
*
()
{
return
_e
;
}
bool
operator
==
(
const
range_iterator
&
other
)
{
return
_e
==
other
.
_e
;
}
bool
operator
!=
(
const
range_iterator
&
other
)
{
return
_e
!=
other
.
_e
;
}
};
struct
crange
{
private
:
private
:
range
*
crange_head
;
// a crange skip list starts with a sentinel range (key 0, sz 0)
public
:
public
:
int
nlevel
;
// number of levels in the crange skip list
crange
(
int
nlevel
);
~
crange
(
void
);
...
...
@@ -120,12 +132,18 @@ public:
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
;
}
range_iterator
begin
()
{
return
range_iterator
(
crange_head
->
next
[
0
].
ptr
());
};
range_iterator
end
()
{
return
range_iterator
(
0
);
};
};
static
inline
range_iterator
begin
(
crange
*
cr
)
{
return
cr
->
begin
();
}
static
inline
range_iterator
end
(
crange
*
cr
)
{
return
cr
->
end
();
}
vm.cc
浏览文件 @
39fa2be7
...
...
@@ -311,11 +311,12 @@ static void
vmap_free
(
void
*
p
)
{
struct
vmap
*
m
=
(
struct
vmap
*
)
p
;
m
->
cr
->
foreach
([](
range
*
r
)
{
for
(
range
*
r
:
m
->
cr
)
{
delete
(
vma
*
)
r
->
value
;
r
->
cr
->
del
(
r
->
key
,
r
->
size
);
return
true
;
});
}
delete
m
->
cr
;
ksfree
(
slab_kshared
,
m
->
kshared
);
freevm
(
m
->
pml4
);
...
...
@@ -384,11 +385,11 @@ vmap_copy(struct vmap *m, int share)
return
0
;
acquire
(
&
m
->
lock
);
if
(
!
m
->
cr
->
foreach
([
share
,
m
,
nm
](
range
*
r
)
->
bool
{
for
(
range
*
r
:
m
->
cr
)
{
struct
vma
*
e
=
(
struct
vma
*
)
r
->
value
;
struct
vma
*
ne
=
new
vma
();
if
(
ne
==
0
)
return
false
;
goto
err
;
ne
->
va_start
=
e
->
va_start
;
ne
->
va_end
=
e
->
va_end
;
...
...
@@ -405,16 +406,10 @@ vmap_copy(struct vmap *m, int share)
}
if
(
ne
->
n
==
0
)
return
false
;
goto
err
;
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
;
}
if
(
share
)
...
...
@@ -422,6 +417,11 @@ vmap_copy(struct vmap *m, int share)
release
(
&
m
->
lock
);
return
nm
;
err
:
vmap_free
(
nm
);
release
(
&
m
->
lock
);
return
0
;
}
int
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论