Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
aa2ba334
提交
aa2ba334
4月 10, 2012
创建
作者:
David Benjamin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Drop the old radix_iterator
Removes a use of descend in skip_empty.
上级
d3adb158
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
7 行增加
和
57 行删除
+7
-57
radix.hh
include/radix.hh
+4
-24
radix.cc
kernel/radix.cc
+3
-33
没有找到文件。
include/radix.hh
浏览文件 @
aa2ba334
...
...
@@ -196,28 +196,12 @@ struct radix {
radix_elem
*
search
(
u64
key
);
radix_range
search_lock
(
u64
start
,
u64
size
);
// k is shifted value.
u64
skip_empty
(
u64
k
)
const
;
NEW_DELETE_OPS
(
radix
)
};
struct
radix_iterator
{
const
radix
*
r_
;
u64
k_
;
radix_iterator
(
const
radix
*
r
,
u64
k
)
:
r_
(
r
),
k_
(
r
->
skip_empty
(
k
))
{}
radix_iterator
&
operator
++
()
{
k_
++
;
k_
=
r_
->
skip_empty
(
k_
);
return
*
this
;
}
radix_elem
*
operator
*
();
bool
operator
==
(
const
radix_iterator
&
other
)
{
return
r_
==
other
.
r_
&&
k_
==
other
.
k_
;
}
bool
operator
!=
(
const
radix_iterator
&
other
)
{
return
r_
!=
other
.
r_
||
k_
!=
other
.
k_
;
}
};
struct
radix_iterator2
{
const
radix
*
r_
;
u64
k_
;
// path_[i] is the node at level i. Note that the leaf is at zero
// and is radix_elem. The rest are radix_node. For now we assume all
// leaves are at level 0. Later we'll steal a bit for them. The root
...
...
@@ -225,9 +209,9 @@ struct radix_iterator2 {
radix_entry
path_
[
radix_levels
+
1
];
u32
leaf_
;
radix_iterator
2
(
const
radix
*
r
,
u64
k
);
radix_iterator
(
const
radix
*
r
,
u64
k
);
radix_iterator
2
&
operator
++
()
{
radix_iterator
&
operator
++
()
{
if
(
!
advance
(
radix_levels
-
1
))
k_
=
~
0ULL
;
return
*
this
;
}
...
...
@@ -237,9 +221,9 @@ struct radix_iterator2 {
radix_node
*
node
(
u32
level
)
{
return
path_
[
level
].
node
();
}
// Compare equality on just the key.
bool
operator
==
(
const
radix_iterator
2
&
other
)
{
bool
operator
==
(
const
radix_iterator
&
other
)
{
return
r_
==
other
.
r_
&&
k_
==
other
.
k_
;
}
bool
operator
!=
(
const
radix_iterator
2
&
other
)
{
bool
operator
!=
(
const
radix_iterator
&
other
)
{
return
r_
!=
other
.
r_
||
k_
!=
other
.
k_
;
}
private
:
...
...
@@ -247,8 +231,6 @@ private:
bool
advance
(
u32
level
);
};
#define radix_iterator radix_iterator2
static
inline
radix_iterator
begin
(
const
radix
&
r
)
{
return
radix_iterator
(
&
r
,
0
);
}
...
...
@@ -261,5 +243,3 @@ begin(const radix_range &rr) { return radix_iterator(rr.r_, rr.start_); }
static
inline
radix_iterator
end
(
const
radix_range
&
rr
)
{
return
radix_iterator
(
rr
.
r_
,
rr
.
start_
+
rr
.
size_
);
}
#undef radix_iterator
kernel/radix.cc
浏览文件 @
aa2ba334
...
...
@@ -97,26 +97,6 @@ radix::search_lock(u64 start, u64 size)
return
radix_range
(
this
,
start
>>
shift_
,
size
>>
shift_
);
}
u64
radix
::
skip_empty
(
u64
k
)
const
{
u64
next_k
=
k
;
while
(
next_k
<
(
1UL
<<
key_bits
))
{
// Does next_k exist?
// FIXME: evil evil const_cast
u32
level
=
descend
(
next_k
,
const_cast
<
radix_ptr
*>
(
&
root_
),
radix_levels
-
1
,
[](
radix_ptr
*
v
){},
false
);
if
(
level
==
0
)
{
return
next_k
;
}
u64
mask
=
1UL
<<
(
bits_per_level
*
level
);
// Skip past everything we know is missing.
next_k
=
(
next_k
&
~
(
mask
-
1
))
+
mask
;
}
// Nope, no successor.
return
~
0ULL
;
}
radix_range
::
radix_range
(
radix
*
r
,
u64
start
,
u64
size
)
:
r_
(
r
),
start_
(
start
),
size_
(
size
)
{
...
...
@@ -175,17 +155,7 @@ radix_range::replace(u64 start, u64 size, radix_elem *val)
}
}
radix_elem
*
radix_iterator
::
operator
*
()
{
radix_elem
*
result
=
0
;
descend
(
k_
,
(
radix_ptr
*
)
&
r_
->
root_
,
radix_levels
-
1
,
[
&
result
](
radix_ptr
*
v
)
{
result
=
v
->
load
().
elem
();
},
false
);
return
result
;
}
radix_iterator2
::
radix_iterator2
(
const
radix
*
r
,
u64
k
)
radix_iterator
::
radix_iterator
(
const
radix
*
r
,
u64
k
)
:
r_
(
r
),
k_
(
k
)
{
dprintf
(
"%p: Made iterator with k = %lu
\n
"
,
r_
,
k_
);
if
(
k_
!=
~
0ULL
)
{
...
...
@@ -199,7 +169,7 @@ radix_iterator2::radix_iterator2(const radix* r, u64 k)
}
bool
radix_iterator
2
::
advance
(
u32
level
)
radix_iterator
::
advance
(
u32
level
)
{
// First, see if we can advance a lower level.
if
(
level
>
leaf_
&&
advance
(
level
-
1
))
{
...
...
@@ -220,7 +190,7 @@ radix_iterator2::advance(u32 level)
}
bool
radix_iterator
2
::
find_first_leaf
(
u32
level
)
radix_iterator
::
find_first_leaf
(
u32
level
)
{
// Find the first non-empty node after k_ on this level.
for
(
u32
idx
=
index
(
k_
,
level
);
idx
<
(
1
<<
bits_per_level
);
idx
++
)
{
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论