Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
d20f5855
提交
d20f5855
authored
10 年前
作者:
Thomas Mueller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
A concurrent linked list, to replace the array list of old roots (work in progress)
上级
836d37e3
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
46 行增加
和
50 行删除
+46
-50
ConcurrentLinkedList.java
h2/src/main/org/h2/mvstore/ConcurrentLinkedList.java
+12
-5
MVMap.java
h2/src/main/org/h2/mvstore/MVMap.java
+1
-5
TestConcurrentLinkedList.java
h2/src/test/org/h2/test/store/TestConcurrentLinkedList.java
+33
-40
没有找到文件。
h2/src/main/org/h2/mvstore/ConcurrentLinkedList.java
浏览文件 @
d20f5855
...
...
@@ -41,24 +41,31 @@ public class ConcurrentLinkedList<K> {
public
void
removeFirst
(
K
obj
)
{
Entry
<
K
>
x
=
head
;
if
(
x
==
null
||
tail
==
x
)
{
throw
DataUtils
.
newUnsupportedOperationException
(
"Must contain at least two entries"
);
if
(
x
==
null
)
{
return
;
}
if
(
x
.
obj
.
equals
(
obj
))
{
if
(
head
==
tail
)
{
tail
=
x
.
next
;
}
head
=
x
.
next
;
}
}
public
void
removeLast
(
K
obj
)
{
Entry
<
K
>
x
=
head
;
Entry
<
K
>
prev
=
x
;
if
(
x
==
null
)
{
return
;
}
Entry
<
K
>
prev
=
null
;
while
(
x
.
next
!=
null
)
{
prev
=
x
;
x
=
x
.
next
;
}
if
(
x
.
obj
.
equals
(
obj
))
{
prev
.
next
=
null
;
if
(
prev
!=
null
)
{
prev
.
next
=
null
;
}
if
(
head
==
tail
)
{
head
=
prev
;
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/MVMap.java
浏览文件 @
d20f5855
...
...
@@ -996,12 +996,8 @@ public class MVMap<K, V> extends AbstractMap<K, V>
return
;
}
Page
last
=
oldRootsList
.
peekLast
();
if
(
oldRootsList
.
peekFirst
()
==
last
)
{
// do nothing if there is no or only one entry
return
;
}
;
// TODO why is this?
;
oldest
--;
while
(
true
)
{
Page
p
=
oldRootsList
.
peekFirst
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/store/TestConcurrentLinkedList.java
浏览文件 @
d20f5855
...
...
@@ -13,6 +13,9 @@ import org.h2.mvstore.ConcurrentLinkedList;
import
org.h2.test.TestBase
;
import
org.h2.util.Task
;
/**
* Test the concurrent linked list.
*/
public
class
TestConcurrentLinkedList
extends
TestBase
{
/**
...
...
@@ -21,19 +24,24 @@ public class TestConcurrentLinkedList extends TestBase {
* @param a ignored
*/
public
static
void
main
(
String
...
a
)
throws
Exception
{
TestBase
.
createCaller
().
init
().
test
();
TestConcurrentLinkedList
test
=
(
TestConcurrentLinkedList
)
TestBase
.
createCaller
().
init
();
test
.
test
();
test
.
testPerformance
();
}
@Override
public
void
test
()
throws
Exception
{
testConcurrent
();
testRandomized
();
}
private
void
testPerformance
()
{
testPerformance
(
true
);
testPerformance
(
false
);
testPerformance
(
true
);
testPerformance
(
false
);
testPerformance
(
true
);
testPerformance
(
false
);
testConcurrent
();
testRandomized
();
}
private
void
testPerformance
(
final
boolean
stock
)
{
...
...
@@ -100,64 +108,49 @@ public class TestConcurrentLinkedList extends TestBase {
LinkedList
<
Integer
>
x
=
new
LinkedList
<
Integer
>();
StringBuilder
buff
=
new
StringBuilder
();
for
(
int
j
=
0
;
j
<
10000
;
j
++)
{
int
opType
=
r
.
nextInt
(
10
);
buff
.
append
(
"["
+
j
+
"] "
);
int
opType
=
r
.
nextInt
(
3
);
switch
(
opType
)
{
case
0
:
{
int
value
=
r
.
nextInt
(
100
);
buff
.
append
(
"
add "
+
value
);
buff
.
append
(
"
add "
+
value
+
"\n"
);
test
.
add
(
value
);
x
.
add
(
value
);
break
;
}
case
1
:
{
Integer
value
=
x
.
peek
();
buff
.
append
(
" peek"
);
if
(
value
==
null
)
{
assertNull
(
test
.
peekFirst
());
if
(
value
!=
null
&&
r
.
nextBoolean
())
{
buff
.
append
(
"removeFirst\n"
);
x
.
removeFirst
();
test
.
removeFirst
(
value
);
}
else
{
assertEquals
(
value
.
intValue
(),
test
.
peekFirst
().
intValue
());
buff
.
append
(
"removeFirst -1\n"
);
test
.
removeFirst
(-
1
);
}
break
;
}
case
2
:
{
Integer
value
=
x
.
peekLast
();
buff
.
append
(
" peeLast"
);
if
(
value
==
null
)
{
assertNull
(
test
.
peekLast
());
if
(
value
!=
null
&&
r
.
nextBoolean
())
{
buff
.
append
(
"removeLast\n"
);
x
.
removeLast
();
test
.
removeLast
(
value
);
}
else
{
assertEquals
(
value
.
intValue
(),
test
.
peekLast
()
.
intValue
());
}
break
;
}
case
3
:
{
if
(
x
.
size
()
>=
2
)
{
Integer
value
=
x
.
peek
();
if
(
value
!=
null
&&
r
.
nextBoolean
())
{
buff
.
append
(
" removeFirst"
);
x
.
removeFirst
();
test
.
removeFirst
(
value
);
}
else
{
test
.
removeFirst
(-
1
);
}
}
break
;
}
case
4
:
{
if
(
x
.
size
()
>=
2
)
{
Integer
value
=
x
.
peekLast
();
if
(
value
!=
null
&&
r
.
nextBoolean
())
{
buff
.
append
(
" removeLast"
);
x
.
removeLast
();
test
.
removeLast
(
value
);
}
else
{
test
.
removeLast
(-
1
);
}
buff
.
append
(
"removeLast -1\n"
);
test
.
removeLast
(-
1
);
}
break
;
}
}
assertEquals
(
toString
(
x
.
iterator
()),
toString
(
test
.
iterator
()));
if
(
x
.
isEmpty
())
{
assertNull
(
test
.
peekFirst
());
assertNull
(
test
.
peekLast
());
}
else
{
assertEquals
(
x
.
peekFirst
().
intValue
(),
test
.
peekFirst
().
intValue
());
assertEquals
(
x
.
peekLast
().
intValue
(),
test
.
peekLast
().
intValue
());
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论