Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Pinoxchio
apollo
提交
5ae338fe
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,发现更多精彩内容 >>
提交
5ae338fe
编写于
9月 17, 2018
作者:
A
azural
提交者:
fengqikai1414
9月 17, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
framework: Add Observe interface
上级
2030f20c
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
140 addition
and
8 deletion
+140
-8
framework/cybertron/node/node.cpp
framework/cybertron/node/node.cpp
+12
-0
framework/cybertron/node/node.h
framework/cybertron/node/node.h
+35
-7
framework/cybertron/node/reader.h
framework/cybertron/node/reader.h
+88
-1
framework/cybertron/node/reader_base.h
framework/cybertron/node/reader_base.h
+5
-0
未找到文件。
framework/cybertron/node/node.cpp
浏览文件 @
5ae338fe
...
...
@@ -43,5 +43,17 @@ Node::~Node() { node_manager_->Leave(attr_, RoleType::ROLE_NODE); }
const
std
::
string
&
Node
::
Name
()
const
{
return
node_name_
;
}
void
Node
::
Observe
()
{
for
(
auto
&
reader
:
readers_
)
{
reader
.
second
->
Observe
();
}
}
void
Node
::
ClearData
()
{
for
(
auto
&
reader
:
readers_
)
{
reader
.
second
->
ClearData
();
}
}
}
// namespace cybertron
}
// namespace apollo
framework/cybertron/node/node.h
浏览文件 @
5ae338fe
...
...
@@ -17,6 +17,7 @@
#ifndef CYBERTRON_NODE_NODE_H_
#define CYBERTRON_NODE_NODE_H_
#include <map>
#include <memory>
#include <string>
...
...
@@ -37,9 +38,7 @@ class Node {
friend
class
TimerComponent
;
friend
std
::
unique_ptr
<
Node
>
CreateNode
(
const
std
::
string
&
,
const
std
::
string
&
);
virtual
~
Node
();
const
std
::
string
&
Name
()
const
;
template
<
typename
MessageT
>
...
...
@@ -70,6 +69,13 @@ class Node {
auto
CreateClient
(
const
std
::
string
&
service_name
)
->
std
::
shared_ptr
<
Client
<
Request
,
Response
>>
;
void
Observe
();
void
ClearData
();
template
<
typename
MessageT
>
auto
GetReader
(
const
std
::
string
&
channel_name
)
->
std
::
shared_ptr
<
Reader
<
MessageT
>>
;
private:
explicit
Node
(
const
std
::
string
&
node_name
,
const
std
::
string
&
name_space
=
""
);
...
...
@@ -83,6 +89,8 @@ class Node {
std
::
string
node_name_
;
std
::
string
name_space_
;
proto
::
RoleAttributes
attr_
;
std
::
mutex
readers_mutex_
;
std
::
map
<
std
::
string
,
std
::
shared_ptr
<
ReaderBase
>>
readers_
;
};
template
<
typename
MessageT
>
...
...
@@ -100,23 +108,32 @@ auto Node::CreateWriter(const std::string& channel_name)
template
<
typename
MessageT
>
auto
Node
::
CreateReader
(
const
proto
::
RoleAttributes
&
role_attr
)
->
std
::
shared_ptr
<
Reader
<
MessageT
>>
{
return
node_channel_impl_
->
template
CreateReader
<
MessageT
>(
role_attr
);
auto
reader
=
node_channel_impl_
->
template
CreateReader
<
MessageT
>(
role_attr
);
std
::
lock_guard
<
std
::
mutex
>
lg
(
readers_mutex_
);
readers_
.
emplace
(
std
::
make_pair
(
role_attr
.
channel_name
(),
reader
));
return
reader
;
}
template
<
typename
MessageT
>
auto
Node
::
CreateReader
(
const
proto
::
RoleAttributes
&
role_attr
,
const
CallbackFunc
<
MessageT
>&
reader_func
)
->
std
::
shared_ptr
<
Reader
<
MessageT
>>
{
return
node_channel_impl_
->
template
CreateReader
<
MessageT
>(
role_attr
,
reader_func
);
auto
reader
=
node_channel_impl_
->
template
CreateReader
<
MessageT
>(
role_attr
,
reader_func
);
std
::
lock_guard
<
std
::
mutex
>
lg
(
readers_mutex_
);
readers_
.
emplace
(
std
::
make_pair
(
role_attr
.
channel_name
(),
reader
));
return
reader
;
}
template
<
typename
MessageT
>
auto
Node
::
CreateReader
(
const
std
::
string
&
channel_name
,
const
CallbackFunc
<
MessageT
>&
reader_func
)
->
std
::
shared_ptr
<
Reader
<
MessageT
>>
{
return
node_channel_impl_
->
template
CreateReader
<
MessageT
>(
channel_name
,
reader_func
);
auto
reader
=
node_channel_impl_
->
template
CreateReader
<
MessageT
>(
channel_name
,
reader_func
);
std
::
lock_guard
<
std
::
mutex
>
lg
(
readers_mutex_
);
readers_
.
emplace
(
std
::
make_pair
(
channel_name
,
reader
));
return
reader
;
}
template
<
typename
Request
,
typename
Response
>
...
...
@@ -135,6 +152,17 @@ auto Node::CreateClient(const std::string& service_name)
service_name
);
}
template
<
typename
MessageT
>
auto
Node
::
GetReader
(
const
std
::
string
&
name
)
->
std
::
shared_ptr
<
Reader
<
MessageT
>>
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
readers_mutex_
);
auto
it
=
readers_
.
find
(
name
);
if
(
it
!=
readers_
.
end
())
{
return
std
::
dynamic_pointer_cast
<
Reader
<
MessageT
>>
(
it
->
second
);
}
return
nullptr
;
}
}
// namespace cybertron
}
// namespace apollo
...
...
framework/cybertron/node/reader.h
浏览文件 @
5ae338fe
...
...
@@ -18,6 +18,7 @@
#define CYBERTRON_NODE_READER_H_
#include <memory>
#include <mutex>
#include <string>
#include <unordered_map>
#include <utility>
...
...
@@ -47,6 +48,8 @@ class Reader : public ReaderBase {
using
LowerReachPtr
=
std
::
shared_ptr
<
transport
::
LowerReach
<
MessageT
>>
;
using
ChangeConnection
=
typename
service_discovery
::
Manager
::
ChangeConnection
;
using
Iterator
=
typename
std
::
list
<
std
::
shared_ptr
<
MessageT
>>::
const_iterator
;
Reader
(
const
proto
::
RoleAttributes
&
role_attr
,
const
CallbackFunc
<
MessageT
>&
reader_func
=
nullptr
);
...
...
@@ -54,6 +57,18 @@ class Reader : public ReaderBase {
bool
Init
()
override
;
void
Shutdown
()
override
;
void
Observe
()
override
;
void
ClearData
()
override
;
bool
HasReceived
()
const
override
;
bool
Empty
()
const
override
;
void
Enqueue
(
const
std
::
shared_ptr
<
MessageT
>&
msg
);
void
SetHistoryDepth
(
const
uint32_t
&
depth
);
uint32_t
GetHistoryDepth
()
const
;
const
std
::
shared_ptr
<
MessageT
>&
GetLatestObserved
()
const
;
const
std
::
shared_ptr
<
MessageT
>&
GetOldestObserved
()
const
;
Iterator
Begin
()
const
{
return
observed_queue_
.
begin
();
}
Iterator
End
()
const
{
return
observed_queue_
.
end
();
}
protected:
void
JoinTheTopology
();
...
...
@@ -66,6 +81,11 @@ class Reader : public ReaderBase {
ChangeConnection
change_conn_
;
service_discovery
::
ChannelManagerPtr
channel_manager_
;
mutable
std
::
mutex
mutex_
;
uint32_t
history_depth_
=
10
;
std
::
list
<
std
::
shared_ptr
<
MessageT
>>
history_queue_
;
std
::
list
<
std
::
shared_ptr
<
MessageT
>>
observed_queue_
;
};
template
<
typename
MessageT
>
...
...
@@ -82,6 +102,18 @@ Reader<MessageT>::~Reader() {
Shutdown
();
}
template
<
typename
MessageT
>
void
Reader
<
MessageT
>::
Enqueue
(
const
std
::
shared_ptr
<
MessageT
>&
msg
)
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
history_queue_
.
push_front
(
msg
);
}
template
<
typename
MessageT
>
void
Reader
<
MessageT
>::
Observe
()
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
observed_queue_
=
history_queue_
;
}
template
<
typename
MessageT
>
bool
Reader
<
MessageT
>::
Init
()
{
if
(
init_
.
exchange
(
true
))
{
...
...
@@ -90,12 +122,16 @@ bool Reader<MessageT>::Init() {
if
(
reader_func_
!=
nullptr
)
{
auto
sched
=
scheduler
::
Scheduler
::
Instance
();
croutine_name_
=
role_attr_
.
node_name
()
+
"_"
+
role_attr_
.
channel_name
();
auto
func
=
[
this
](
const
std
::
shared_ptr
<
MessageT
>&
msg
)
{
this
->
Enqueue
(
msg
);
this
->
reader_func_
(
msg
);
};
auto
dv
=
std
::
make_shared
<
data
::
DataVisitor
<
MessageT
>>
(
role_attr_
.
channel_id
(),
role_attr_
.
qos_profile
().
depth
());
// Using factory to wrap templates.
croutine
::
RoutineFactory
factory
=
croutine
::
CreateRoutineFactory
<
MessageT
>
(
reader_func_
,
dv
);
croutine
::
CreateRoutineFactory
<
MessageT
>
(
std
::
move
(
func
)
,
dv
);
if
(
!
sched
->
CreateTask
(
factory
,
croutine_name_
))
{
init_
.
exchange
(
false
);
return
false
;
...
...
@@ -169,6 +205,57 @@ void Reader<MessageT>::OnChannelChange(const proto::ChangeMsg& change_msg) {
}
}
template
<
typename
MessageT
>
bool
Reader
<
MessageT
>::
HasReceived
()
const
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
return
!
history_queue_
.
empty
();
}
template
<
typename
MessageT
>
bool
Reader
<
MessageT
>::
Empty
()
const
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
return
observed_queue_
.
empty
();
}
template
<
typename
MessageT
>
const
std
::
shared_ptr
<
MessageT
>&
Reader
<
MessageT
>::
GetLatestObserved
()
const
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
if
(
observed_queue_
.
empty
())
{
return
nullptr
;
}
return
observed_queue_
.
front
();
}
template
<
typename
MessageT
>
const
std
::
shared_ptr
<
MessageT
>&
Reader
<
MessageT
>::
GetOldestObserved
()
const
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
if
(
observed_queue_
.
empty
())
{
return
nullptr
;
}
return
observed_queue_
.
back
();
}
template
<
typename
MessageT
>
void
Reader
<
MessageT
>::
ClearData
()
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
history_queue_
.
clear
();
observed_queue_
.
clear
();
}
template
<
typename
MessageT
>
void
Reader
<
MessageT
>::
SetHistoryDepth
(
const
uint32_t
&
depth
)
{
std
::
lock_guard
<
std
::
mutex
>
lg
(
mutex_
);
history_depth_
=
depth
;
while
(
history_queue_
.
size
()
>
history_depth_
)
{
history_queue_
.
pop_back
();
}
}
template
<
typename
MessageT
>
uint32_t
Reader
<
MessageT
>::
GetHistoryDepth
()
const
{
return
history_depth_
;
}
}
// namespace cybertron
}
// namespace apollo
...
...
framework/cybertron/node/reader_base.h
浏览文件 @
5ae338fe
...
...
@@ -50,6 +50,11 @@ class ReaderBase {
virtual
bool
Init
()
=
0
;
virtual
void
Shutdown
()
=
0
;
virtual
void
ClearData
()
=
0
;
virtual
void
Observe
()
=
0
;
virtual
bool
Empty
()
const
=
0
;
virtual
bool
HasReceived
()
const
=
0
;
const
std
::
string
&
GetChannelName
()
const
{
return
role_attr_
.
channel_name
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录