Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
b8b64da4
提交
b8b64da4
2月 15, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
random cleanup
上级
adf12bd3
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
15 行增加
和
19 行删除
+15
-19
crange.cc
crange.cc
+15
-19
没有找到文件。
crange.cc
浏览文件 @
b8b64da4
...
...
@@ -53,6 +53,8 @@ extern "C" {
enum
{
crange_debug
=
0
};
enum
{
crange_checking
=
0
};
#define dprintf(...) do { if (crange_debug) cprintf(__VA_ARGS__); } while(0)
//
// Methods for ranges
//
...
...
@@ -87,8 +89,7 @@ void range::print(int l)
range
::~
range
()
{
if
(
crange_debug
)
cprintf
(
"%d: range_free: 0x%lx 0x%lx-0x%lx(%ld)
\n
"
,
myproc
()
->
cpuid
,
(
u64
)
this
,
this
->
key
,
this
->
key
+
this
->
size
,
this
->
size
);
dprintf
(
"%d: range_free: 0x%lx 0x%lx-0x%lx(%ld)
\n
"
,
myproc
()
->
cpuid
,
(
u64
)
this
,
this
->
key
,
this
->
key
+
this
->
size
,
this
->
size
);
this
->
cr
->
check
(
this
);
// assert(this->curlevel == -1);
for
(
int
l
=
0
;
l
<
this
->
nlevel
;
l
++
)
{
...
...
@@ -100,8 +101,7 @@ range::~range()
void
range
::
free_delayed
(
void
)
{
if
(
crange_debug
)
cprintf
(
"%d: free_delayed: 0x%lx 0x%lx-0x%lx(%lu) %lu
\n
"
,
myproc
()
->
pid
,
(
long
)
this
,
this
->
key
,
this
->
key
+
this
->
size
,
this
->
size
,
myproc
()
->
epoch
);
dprintf
(
"%d: free_delayed: 0x%lx 0x%lx-0x%lx(%lu) %lu
\n
"
,
myproc
()
->
pid
,
(
long
)
this
,
this
->
key
,
this
->
key
+
this
->
size
,
this
->
size
,
myproc
()
->
epoch
);
this
->
cr
->
check
(
this
);
assert
(
this
->
curlevel
==
-
1
);
gc_delayed
(
this
);
...
...
@@ -118,8 +118,7 @@ void range::dec_ref(void)
range
::
range
(
crange
*
cr
,
u64
k
,
u64
sz
,
void
*
v
,
markptr
<
range
>
n
,
int
nlevel
)
:
rcu_freed
(
"range_delayed"
)
{
if
(
crange_debug
)
cprintf
(
"range:range:: %lu %lu %d
\n
"
,
k
,
sz
,
nlevel
);
dprintf
(
"range:range:: %lu %lu %d
\n
"
,
k
,
sz
,
nlevel
);
this
->
key
=
k
;
this
->
size
=
sz
;
this
->
value
=
v
;
...
...
@@ -287,12 +286,12 @@ crange::crange(int nlevel)
assert
(
nlevel
>=
0
);
this
->
nlevel
=
nlevel
;
this
->
crange_head
=
new
range
(
this
,
0
,
0
,
nullptr
,
nullptr
,
nlevel
);
if
(
crange_debug
)
c
printf
(
"crange::crange return 0x%lx
\n
"
,
(
u64
)
this
);
d
printf
(
"crange::crange return 0x%lx
\n
"
,
(
u64
)
this
);
}
crange
::~
crange
()
{
if
(
crange_debug
)
c
printf
(
"crange_free: 0x%lx
\n
"
,
(
u64
)
this
);
d
printf
(
"crange_free: 0x%lx
\n
"
,
(
u64
)
this
);
range
*
e
,
*
n
;
for
(
e
=
this
->
crange_head
->
next
[
0
].
ptr
();
e
;
e
=
n
)
{
n
=
e
->
next
[
0
].
ptr
();
...
...
@@ -333,7 +332,7 @@ void crange::check(struct range *absent)
s
=
e
->
next
[
l
].
ptr
();
assert
(
s
!=
e
);
if
(
!
e
->
next
[
l
].
mark
()
&&
s
&&
(
e
->
key
+
e
->
size
>
s
->
key
))
{
if
(
crange_debug
)
c
printf
(
"%d: e(%lu,%lu) overlaps with s(%lu,%lu)
\n
"
,
t
,
e
->
key
,
e
->
size
,
s
->
key
,
e
->
size
);
d
printf
(
"%d: e(%lu,%lu) overlaps with s(%lu,%lu)
\n
"
,
t
,
e
->
key
,
e
->
size
,
s
->
key
,
e
->
size
);
this
->
print
(
1
);
assert
(
0
);
}
...
...
@@ -502,13 +501,12 @@ range* crange::search(u64 k, u64 sz, int mod)
int
n
=
(
mod
)
?
range_draw_nlevel
(
this
->
nlevel
)
:
0
;
gc_begin_epoch
();
//read_counters(myproc()->cpuid, 0);
if
(
crange_debug
)
c
printf
(
"crange_search: 0x%lx 0x%lx
\n
"
,
(
u64
)
this
,
k
);
d
printf
(
"crange_search: 0x%lx 0x%lx
\n
"
,
(
u64
)
this
,
k
);
r
=
nullptr
;
p
=
this
->
crange_head
;
for
(
int
l
=
this
->
nlevel
-
1
;
l
>=
0
;
l
--
)
{
for
(
e
=
p
->
next
[
l
].
ptr
();
e
;
p
=
e
,
e
=
e
->
next
[
l
].
ptr
())
{
if
(
crange_debug
)
cprintf
(
"level %d: 0x%lx 0x%lx-%lx(%lu) 0x%lx-0x%lx(%lu)
\n
"
,
l
,
(
u64
)
p
,
p
->
key
,
p
->
key
+
p
->
size
,
p
->
size
,
e
->
key
,
e
->
key
+
e
->
size
,
e
->
size
);
dprintf
(
"level %d: 0x%lx 0x%lx-%lx(%lu) 0x%lx-0x%lx(%lu)
\n
"
,
l
,
(
u64
)
p
,
p
->
key
,
p
->
key
+
p
->
size
,
p
->
size
,
e
->
key
,
e
->
key
+
e
->
size
,
e
->
size
);
// skip all marked ranges, but don't update p because
// we don't want to descend on a marked range down.
while
(
e
&&
e
->
next
[
l
].
mark
())
{
...
...
@@ -531,8 +529,7 @@ range* crange::search(u64 k, u64 sz, int mod)
end
:
//read_counters(myproc()->cpuid, 1);
gc_end_epoch
();
if
(
crange_debug
)
cprintf
(
"crange_search: 0x%lx return (0x%lx,0x%lx)
\n
"
,
(
u64
)
this
,
r
?
r
->
key
:
0
,
r
?
r
->
size
:
0
);
dprintf
(
"crange_search: 0x%lx return (0x%lx,0x%lx)
\n
"
,
(
u64
)
this
,
r
?
r
->
key
:
0
,
r
?
r
->
size
:
0
);
return
r
;
}
...
...
@@ -547,10 +544,9 @@ void crange::del(u64 k, u64 sz)
assert
(
this
);
gc_begin_epoch
();
if
(
crange_debug
)
cprintf
(
"crange_del: 0x%lx 0x%lx-0x%lx(%ld)
\n
"
,
(
u64
)
this
,
k
,
k
+
sz
,
sz
);
dprintf
(
"crange_del: 0x%lx 0x%lx-0x%lx(%ld)
\n
"
,
(
u64
)
this
,
k
,
k
+
sz
,
sz
);
if
(
!
this
->
find_and_lock
(
k
,
sz
,
&
prev
,
&
first
,
&
last
,
&
succ
))
{
// done?
if
(
crange_debug
)
c
printf
(
"crange_del: [0x%lx,0x%lx) not present
\n
"
,
k
,
sz
);
d
printf
(
"crange_del: [0x%lx,0x%lx) not present
\n
"
,
k
,
sz
);
release
(
prev
->
lock
);
goto
done
;
}
...
...
@@ -586,11 +582,11 @@ void crange::add(u64 k, u64 sz, void *v)
struct
range
*
succ
;
struct
range
*
repl
=
nullptr
;
if
(
crange_debug
)
c
printf
(
"crange_add: 0x%lx 0x%lx-0x%lx(%lu)
\n
"
,
(
u64
)
this
,
k
,
k
+
sz
,
sz
);
d
printf
(
"crange_add: 0x%lx 0x%lx-0x%lx(%lu)
\n
"
,
(
u64
)
this
,
k
,
k
+
sz
,
sz
);
assert
(
this
);
gc_begin_epoch
();
if
(
this
->
find_and_lock
(
k
,
sz
,
&
prev
,
&
first
,
&
last
,
&
succ
))
{
if
(
crange_debug
)
c
printf
(
"crange_add(0x%lx,0x%lx) overlaps with [0x%lx,0x%lx)
\n
"
,
k
,
sz
,
first
->
key
,
first
->
size
);
d
printf
(
"crange_add(0x%lx,0x%lx) overlaps with [0x%lx,0x%lx)
\n
"
,
k
,
sz
,
first
->
key
,
first
->
size
);
repl
=
replace
(
k
,
sz
,
v
,
first
,
last
,
succ
);
}
else
{
repl
=
succ
;
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论