Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Pinoxchio
apollo
提交
e17ae6c7
A
apollo
项目概览
Pinoxchio
/
apollo
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apollo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e17ae6c7
编写于
11月 21, 2018
作者:
F
fengkaiwen01
提交者:
Jiangtao Hu
12月 13, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
framework: add memory order in hash map
上级
78d0e40d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
48 addition
and
34 deletion
+48
-34
cyber/base/atomic_hash_map.h
cyber/base/atomic_hash_map.h
+47
-33
cyber/base/atomic_hash_map_test.cc
cyber/base/atomic_hash_map_test.cc
+1
-1
未找到文件。
cyber/base/atomic_hash_map.h
浏览文件 @
e17ae6c7
...
...
@@ -86,16 +86,20 @@ class AtomicHashMap {
private:
struct
Entry
{
Entry
()
{}
explicit
Entry
(
K
key
)
:
key
(
key
)
{
value_ptr
.
store
(
new
V
());
}
Entry
(
K
key
,
const
V
&
value
)
:
key
(
key
)
{
value_ptr
.
store
(
new
V
(
value
));
}
explicit
Entry
(
K
key
)
:
key
(
key
)
{
value_ptr
.
store
(
new
V
(),
std
::
memory_order_release
);
}
Entry
(
K
key
,
const
V
&
value
)
:
key
(
key
)
{
value_ptr
.
store
(
new
V
(
value
),
std
::
memory_order_release
);
}
Entry
(
K
key
,
V
&&
value
)
:
key
(
key
)
{
value_ptr
.
store
(
new
V
(
std
::
forward
<
V
>
(
value
)));
value_ptr
.
store
(
new
V
(
std
::
forward
<
V
>
(
value
))
,
std
::
memory_order_release
);
}
~
Entry
()
{
delete
value_ptr
.
load
();
}
~
Entry
()
{
delete
value_ptr
.
load
(
std
::
memory_order_acquire
);
}
void
Release
()
{
if
(
ref_count
.
fetch_sub
(
1
)
==
1
)
{
delete
value_ptr
.
load
();
delete
value_ptr
.
load
(
std
::
memory_order_acquire
);
delete
this
;
}
}
...
...
@@ -113,7 +117,7 @@ class AtomicHashMap {
~
Bucket
()
{
Entry
*
ite
=
head_
;
while
(
ite
)
{
auto
tmp
=
ite
->
next
.
load
();
auto
tmp
=
ite
->
next
.
load
(
std
::
memory_order_acquire
);
delete
ite
;
ite
=
tmp
;
}
...
...
@@ -130,15 +134,15 @@ class AtomicHashMap {
}
bool
Has
(
K
key
)
{
Entry
*
m_target
=
head_
->
next
.
load
();
Entry
*
m_target
=
head_
->
next
.
load
(
std
::
memory_order_acquire
);
while
(
Entry
*
target
=
Unmark
(
m_target
))
{
if
(
Marked
(
target
->
next
.
load
()))
{
m_target
=
head_
->
next
.
load
();
if
(
Marked
(
target
->
next
.
load
(
std
::
memory_order_acquire
)))
{
m_target
=
head_
->
next
.
load
(
std
::
memory_order_acquire
);
continue
;
}
if
(
target
->
key
<
key
)
{
m_target
=
target
->
next
.
load
();
m_target
=
target
->
next
.
load
(
std
::
memory_order_acquire
);
continue
;
}
else
{
return
target
->
key
==
key
;
...
...
@@ -149,12 +153,12 @@ class AtomicHashMap {
bool
Find
(
K
key
,
Entry
**
prev_ptr
,
Entry
**
target_ptr
)
{
Entry
*
prev
=
head_
;
Entry
*
m_target
=
head_
->
next
.
load
();
Entry
*
m_target
=
head_
->
next
.
load
(
std
::
memory_order_acquire
);
while
(
Entry
*
target
=
Unmark
(
m_target
))
{
auto
next
=
target
->
next
.
load
();
auto
next
=
target
->
next
.
load
(
std
::
memory_order_acquire
);
if
(
Marked
(
next
)
&&
Unmark
(
next
))
{
prev
=
head_
;
m_target
=
head_
->
next
.
load
();
m_target
=
head_
->
next
.
load
(
std
::
memory_order_acquire
);
continue
;
}
...
...
@@ -170,7 +174,7 @@ class AtomicHashMap {
return
false
;
}
else
{
prev
=
target
;
m_target
=
target
->
next
.
load
();
m_target
=
target
->
next
.
load
(
std
::
memory_order_acquire
);
}
}
*
prev_ptr
=
prev
;
...
...
@@ -186,11 +190,11 @@ class AtomicHashMap {
while
(
true
)
{
if
(
Find
(
key
,
&
prev
,
&
target
))
{
// key exists, update value
auto
old_val_ptr
=
target
->
value_ptr
.
load
();
auto
old_val_ptr
=
target
->
value_ptr
.
load
(
std
::
memory_order_acquire
);
// value_ptr will be set to nullptr befor remove, so check first
while
(
old_val_ptr
)
{
if
(
target
->
value_ptr
.
compare_exchange_strong
(
old_val_ptr
,
new_value
,
std
::
memory_order_acq
uire
,
old_val_ptr
,
new_value
,
std
::
memory_order_acq
_rel
,
std
::
memory_order_relaxed
))
{
target
->
Release
();
delete
new_entry
;
...
...
@@ -199,8 +203,10 @@ class AtomicHashMap {
}
continue
;
}
else
{
new_entry
->
next
.
store
(
target
);
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
new_entry
))
{
new_entry
->
next
.
store
(
target
,
std
::
memory_order_release
);
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
new_entry
,
std
::
memory_order_acq_rel
,
std
::
memory_order_relaxed
))
{
// Insert success
if
(
target
)
{
target
->
Release
();
...
...
@@ -221,11 +227,11 @@ class AtomicHashMap {
while
(
true
)
{
if
(
Find
(
key
,
&
prev
,
&
target
))
{
// key exists, update value
auto
old_val_ptr
=
target
->
value_ptr
.
load
();
auto
old_val_ptr
=
target
->
value_ptr
.
load
(
std
::
memory_order_acquire
);
// value_ptr will be set to nullptr befor remove, so check first
while
(
old_val_ptr
)
{
if
(
target
->
value_ptr
.
compare_exchange_strong
(
old_val_ptr
,
new_value
,
std
::
memory_order_acq
uire
,
old_val_ptr
,
new_value
,
std
::
memory_order_acq
_rel
,
std
::
memory_order_relaxed
))
{
target
->
Release
();
delete
new_entry
;
...
...
@@ -234,8 +240,10 @@ class AtomicHashMap {
}
continue
;
}
else
{
new_entry
->
next
.
store
(
target
);
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
new_entry
))
{
new_entry
->
next
.
store
(
target
,
std
::
memory_order_release
);
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
new_entry
,
std
::
memory_order_acq_rel
,
std
::
memory_order_relaxed
))
{
// Insert success
if
(
target
)
{
target
->
Release
();
...
...
@@ -256,11 +264,12 @@ class AtomicHashMap {
while
(
true
)
{
if
(
Find
(
key
,
&
prev
,
&
target
))
{
// key exists, update value
auto
old_val_ptr
=
target
->
value_ptr
.
load
();
auto
old_val_ptr
=
target
->
value_ptr
.
load
(
std
::
memory_order_acquire
);
// value_ptr will be set to nullptr befor remove, so check first
while
(
old_val_ptr
)
{
if
(
target
->
value_ptr
.
compare_exchange_strong
(
old_val_ptr
,
new_value
))
{
if
(
target
->
value_ptr
.
compare_exchange_strong
(
old_val_ptr
,
new_value
,
std
::
memory_order_acq_rel
,
std
::
memory_order_relaxed
))
{
target
->
Release
();
delete
new_entry
;
return
;
...
...
@@ -268,8 +277,10 @@ class AtomicHashMap {
}
continue
;
}
else
{
new_entry
->
next
.
store
(
target
);
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
new_entry
))
{
new_entry
->
next
.
store
(
target
,
std
::
memory_order_release
);
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
new_entry
,
std
::
memory_order_acq_rel
,
std
::
memory_order_relaxed
))
{
// Insert success
if
(
target
)
{
target
->
Release
();
...
...
@@ -292,16 +303,19 @@ class AtomicHashMap {
}
return
false
;
}
Entry
*
old_next
=
target
->
next
.
load
();
Entry
*
old_next
=
target
->
next
.
load
(
std
::
memory_order_acquire
);
// mark befor remove
if
(
!
target
->
next
.
compare_exchange_strong
(
old_next
,
Mark
(
old_next
)))
{
if
(
!
target
->
next
.
compare_exchange_strong
(
old_next
,
Mark
(
old_next
),
std
::
memory_order_acq_rel
,
std
::
memory_order_relaxed
))
{
target
->
Release
();
continue
;
}
target
->
value_ptr
.
store
(
nullptr
);
target
->
value_ptr
.
store
(
nullptr
,
std
::
memory_order_release
);
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
Unmark
(
target
->
next
.
load
())))
{
if
(
prev
->
next
.
compare_exchange_strong
(
target
,
Unmark
(
target
->
next
.
load
(
std
::
memory_order_acquire
)),
std
::
memory_order_acq_rel
,
std
::
memory_order_relaxed
))
{
target
->
Release
();
return
true
;
}
...
...
@@ -312,7 +326,7 @@ class AtomicHashMap {
Entry
*
prev
=
nullptr
;
Entry
*
target
=
nullptr
;
if
(
Find
(
key
,
&
prev
,
&
target
))
{
*
value
=
target
->
value_ptr
.
load
();
*
value
=
target
->
value_ptr
.
load
(
std
::
memory_order_acquire
);
target
->
Release
();
return
true
;
}
...
...
cyber/base/atomic_hash_map_test.cc
浏览文件 @
e17ae6c7
...
...
@@ -73,7 +73,7 @@ TEST(AtomicHashMapTest, int_str) {
TEST
(
AtomicHashMapTest
,
concurrency
)
{
AtomicHashMap
<
int
,
std
::
string
,
1024
>
map
;
int
thread_num
=
32
;
std
::
thread
t
[
thread_num
];
std
::
thread
t
[
32
];
volatile
bool
ready
=
false
;
for
(
int
i
=
0
;
i
<
thread_num
;
i
++
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录