Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
ea416994
提交
ea416994
2月 19, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
const'ify various fields in crange, which helps reasoning
about what fields can/cannot be changed by another core while the object is allocated.
上级
ced82a19
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
32 行增加
和
36 行删除
+32
-36
crange.hh
include/crange.hh
+15
-10
crange.cc
kernel/crange.cc
+17
-26
没有找到文件。
include/crange.hh
浏览文件 @
ea416994
...
@@ -86,12 +86,12 @@ class markptr_mark : public markptr<T> {
...
@@ -86,12 +86,12 @@ class markptr_mark : public markptr<T> {
struct
range
:
public
rcu_freed
{
struct
range
:
public
rcu_freed
{
private
:
private
:
u64
key
;
const
u64
key
;
u64
size
;
const
u64
size
;
atomic
<
int
>
curlevel
;
// the current levels it appears on
atomic
<
int
>
curlevel
;
// the current levels it appears on
int
nlevel
;
// the number of levels this range should appear
const
int
nlevel
;
// the number of levels this range should appear
crange
*
c
r
;
// the crange this range is part of
crange
*
c
onst
cr
;
// the crange this range is part of
markptr
<
range
>*
next
;
// one next pointer per level
markptr
<
range
>*
const
next
;
// one next pointer per level
spinlock
*
lock
;
// on separate cache line?
spinlock
*
lock
;
// on separate cache line?
void
print
(
int
l
);
void
print
(
int
l
);
...
@@ -131,7 +131,8 @@ class crange_locked;
...
@@ -131,7 +131,8 @@ class crange_locked;
struct
crange
{
struct
crange
{
private
:
private
:
range
*
crange_head
;
// a crange skip list starts with a sentinel range (key 0, sz 0)
const
int
nlevel
;
// number of levels in the crange skip list
range
*
const
crange_head
;
// a crange skip list starts with a sentinel range (key 0, sz 0)
static
void
mark
(
range
*
f
,
range
*
s
);
static
void
mark
(
range
*
f
,
range
*
s
);
static
void
freen
(
struct
range
*
f
,
struct
range
*
l
);
static
void
freen
(
struct
range
*
f
,
struct
range
*
l
);
...
@@ -147,7 +148,6 @@ struct crange {
...
@@ -147,7 +148,6 @@ struct crange {
friend
class
range
;
friend
class
range
;
public
:
public
:
int
nlevel
;
// number of levels in the crange skip list
crange
(
int
nlevel
);
crange
(
int
nlevel
);
~
crange
(
void
);
~
crange
(
void
);
...
@@ -172,10 +172,15 @@ end(const crange &cr)
...
@@ -172,10 +172,15 @@ end(const crange &cr)
struct
crange_locked
{
struct
crange_locked
{
private
:
private
:
crange
*
cr_
;
crange
*
c
onst
c
r_
;
u64
base_
,
size_
;
const
u64
base_
,
size_
;
range
*
prev_
,
*
first_
,
*
last_
,
*
succ_
;
range
*
const
prev_
;
range
*
first_
;
range
*
last_
;
range
*
const
succ_
;
bool
moved_
;
scoped_gc_epoch
gc
;
scoped_gc_epoch
gc
;
crange_locked
(
crange
*
cr
,
u64
base
,
u64
size
,
range
*
p
,
range
*
f
,
range
*
l
,
range
*
s
);
crange_locked
(
crange
*
cr
,
u64
base
,
u64
size
,
range
*
p
,
range
*
f
,
range
*
l
,
range
*
s
);
...
...
kernel/crange.cc
浏览文件 @
ea416994
...
@@ -115,17 +115,13 @@ range::dec_ref(void)
...
@@ -115,17 +115,13 @@ range::dec_ref(void)
}
}
range
::
range
(
crange
*
crarg
,
u64
k
,
u64
sz
,
int
nl
)
range
::
range
(
crange
*
crarg
,
u64
k
,
u64
sz
,
int
nl
)
:
rcu_freed
(
"range_delayed"
)
:
rcu_freed
(
"range_delayed"
),
key
(
k
),
size
(
sz
),
curlevel
(
0
),
nlevel
(
nl
?:
range_draw_nlevel
(
cr
->
nlevel
)),
cr
(
crarg
),
next
(
new
markptr
<
range
>
[
nlevel
])
{
{
dprintf
(
"range::range: %lu %lu %d
\n
"
,
k
,
sz
,
nl
);
dprintf
(
"range::range: %lu %lu %d
\n
"
,
k
,
sz
,
nl
);
key
=
k
;
size
=
sz
;
cr
=
crarg
;
assert
(
cr
->
nlevel
>
0
);
assert
(
cr
->
nlevel
>
0
);
curlevel
=
0
;
if
(
nl
==
0
)
nlevel
=
range_draw_nlevel
(
cr
->
nlevel
);
else
nlevel
=
nl
;
next
=
new
markptr
<
range
>
[
nlevel
];
// cache align?
assert
(
next
);
assert
(
next
);
for
(
int
l
=
0
;
l
<
nlevel
;
l
++
)
next
[
l
]
=
0
;
for
(
int
l
=
0
;
l
<
nlevel
;
l
++
)
next
[
l
]
=
0
;
assert
(
kmalign
((
void
**
)
&
lock
,
CACHELINE
,
assert
(
kmalign
((
void
**
)
&
lock
,
CACHELINE
,
...
@@ -203,10 +199,9 @@ crange::print(int full)
...
@@ -203,10 +199,9 @@ crange::print(int full)
}
}
crange
::
crange
(
int
nl
)
crange
::
crange
(
int
nl
)
:
nlevel
(
nl
),
crange_head
(
new
range
(
this
,
0
,
0
,
nlevel
))
{
{
assert
(
nl
>
0
);
assert
(
nl
>
0
);
nlevel
=
nl
;
crange_head
=
new
range
(
this
,
0
,
0
,
nlevel
);
dprintf
(
"crange::crange return 0x%lx
\n
"
,
(
u64
)
this
);
dprintf
(
"crange::crange return 0x%lx
\n
"
,
(
u64
)
this
);
}
}
...
@@ -471,31 +466,27 @@ crange::search_lock(u64 k, u64 sz)
...
@@ -471,31 +466,27 @@ crange::search_lock(u64 k, u64 sz)
}
}
crange_locked
::
crange_locked
(
crange
*
cr
,
u64
base
,
u64
sz
,
range
*
p
,
range
*
f
,
range
*
l
,
range
*
s
)
crange_locked
::
crange_locked
(
crange
*
cr
,
u64
base
,
u64
sz
,
range
*
p
,
range
*
f
,
range
*
l
,
range
*
s
)
:
cr_
(
cr
),
base_
(
base
),
size_
(
sz
),
prev_
(
p
),
first_
(
f
),
last_
(
l
),
succ_
(
s
)
:
cr_
(
cr
),
base_
(
base
),
size_
(
sz
),
prev_
(
p
),
first_
(
f
),
last_
(
l
),
succ_
(
s
)
,
moved_
(
false
)
{
{
}
}
crange_locked
::
crange_locked
(
crange_locked
&&
x
)
crange_locked
::
crange_locked
(
crange_locked
&&
x
)
:
gc
(
std
::
move
(
x
.
gc
))
:
cr_
(
x
.
cr_
),
base_
(
x
.
base_
),
size_
(
x
.
size_
),
prev_
(
x
.
prev_
),
first_
(
x
.
first_
),
last_
(
x
.
last_
),
succ_
(
x
.
succ_
),
moved_
(
false
),
gc
(
std
::
move
(
x
.
gc
))
{
{
cr_
=
x
.
cr_
;
x
.
moved_
=
true
;
base_
=
x
.
base_
;
size_
=
x
.
size_
;
prev_
=
x
.
prev_
;
first_
=
x
.
first_
;
last_
=
x
.
last_
;
succ_
=
x
.
succ_
;
x
.
cr_
=
0
;
x
.
prev_
=
0
;
x
.
first_
=
0
;
x
.
last_
=
0
;
x
.
succ_
=
0
;
}
}
crange_locked
::~
crange_locked
()
crange_locked
::~
crange_locked
()
{
{
if
(
prev
_
)
{
if
(
!
moved
_
)
{
range
*
n
;
range
*
n
;
for
(
range
*
e
=
prev_
;
e
&&
e
!=
succ_
;
e
=
n
)
{
for
(
range
*
e
=
prev_
;
e
&&
e
!=
succ_
;
e
=
n
)
{
// as soon a we release, the next pointer can change, so read it first
// as soon a we release, the next pointer can change, so read it first
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论