Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Pinoxchio
apollo
提交
dd53d485
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,发现更多精彩内容 >>
提交
dd53d485
编写于
9月 18, 2018
作者:
G
gruminions
提交者:
fengqikai1414
9月 18, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
framework: rename, 1.change Dispatcher to BlockerManager 2.change Message to Blocker
上级
6046b544
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
445 addition
and
264 deletion
+445
-264
framework/CMakeLists.txt
framework/CMakeLists.txt
+2
-2
framework/cybertron/blocker/CMakeLists.txt
framework/cybertron/blocker/CMakeLists.txt
+6
-0
framework/cybertron/blocker/blocker.h
framework/cybertron/blocker/blocker.h
+44
-44
framework/cybertron/blocker/blocker_manager.cpp
framework/cybertron/blocker/blocker_manager.cpp
+8
-8
framework/cybertron/blocker/blocker_manager.h
framework/cybertron/blocker/blocker_manager.h
+156
-0
framework/cybertron/blocker/intra_reader.h
framework/cybertron/blocker/intra_reader.h
+37
-36
framework/cybertron/blocker/intra_writer.h
framework/cybertron/blocker/intra_writer.h
+27
-16
framework/cybertron/component/component.h
framework/cybertron/component/component.h
+31
-31
framework/cybertron/dispatcher/CMakeLists.txt
framework/cybertron/dispatcher/CMakeLists.txt
+0
-6
framework/cybertron/node/node_channel_impl.h
framework/cybertron/node/node_channel_impl.h
+5
-5
framework/cybertron/test/CMakeLists.txt
framework/cybertron/test/CMakeLists.txt
+1
-1
framework/cybertron/test/blocker/CMakeLists.txt
framework/cybertron/test/blocker/CMakeLists.txt
+27
-0
framework/cybertron/test/blocker/blocker_manager_test.cpp
framework/cybertron/test/blocker/blocker_manager_test.cpp
+35
-33
framework/cybertron/test/blocker/blocker_test.cpp
framework/cybertron/test/blocker/blocker_test.cpp
+44
-44
framework/cybertron/test/dispatcher/CMakeLists.txt
framework/cybertron/test/dispatcher/CMakeLists.txt
+0
-27
framework/examples/CMakeLists.txt
framework/examples/CMakeLists.txt
+4
-4
framework/examples/blocker_example.cpp
framework/examples/blocker_example.cpp
+18
-7
未找到文件。
framework/CMakeLists.txt
浏览文件 @
dd53d485
...
...
@@ -27,7 +27,7 @@ add_subdirectory(sensor)
add_subdirectory
(
third_party
)
add_subdirectory
(
python
)
add_subdirectory
(
cybertron/
dispatch
er
)
add_subdirectory
(
cybertron/
block
er
)
file
(
GLOB CYBERTRON_SRCS
"cybertron/*.cpp"
...
...
@@ -65,7 +65,7 @@ target_link_libraries(cybertron
protobuf
cybertron_proto
cybertron_common
cybertron_
dispatch
er
cybertron_
block
er
fastrtps
fastcdr
-lrt
...
...
framework/cybertron/blocker/CMakeLists.txt
0 → 100644
浏览文件 @
dd53d485
project
(
cybertron_blocker
)
aux_source_directory
(
${
PROJECT_SOURCE_DIR
}
BLOCKER_SRCS
)
add_library
(
${
PROJECT_NAME
}
${
BLOCKER_SRCS
}
)
install
(
TARGETS cybertron_blocker LIBRARY DESTINATION lib
)
framework/cybertron/
dispatcher/message
.h
→
framework/cybertron/
blocker/blocker
.h
浏览文件 @
dd53d485
...
...
@@ -14,8 +14,8 @@
* limitations under the License.
*****************************************************************************/
#ifndef CYBERTRON_
DISPATCHER_MESSAGE
_H_
#define CYBERTRON_
DISPATCHER_MESSAGE
_H_
#ifndef CYBERTRON_
BLOCKER_BLOCKER
_H_
#define CYBERTRON_
BLOCKER_BLOCKER
_H_
#include <assert.h>
#include <stddef.h>
...
...
@@ -29,11 +29,11 @@
namespace
apollo
{
namespace
cybertron
{
namespace
dispatch
er
{
namespace
block
er
{
class
Message
Base
{
class
Blocker
Base
{
public:
virtual
~
Message
Base
()
=
default
;
virtual
~
Blocker
Base
()
=
default
;
virtual
void
ClearPublished
()
=
0
;
virtual
void
Observe
()
=
0
;
...
...
@@ -46,13 +46,13 @@ class MessageBase {
virtual
const
std
::
string
&
channel_name
()
const
=
0
;
};
struct
Message
Attr
{
Message
Attr
()
:
capacity
(
10
),
channel_name
(
""
)
{}
explicit
Message
Attr
(
const
std
::
string
&
channel
)
struct
Blocker
Attr
{
Blocker
Attr
()
:
capacity
(
10
),
channel_name
(
""
)
{}
explicit
Blocker
Attr
(
const
std
::
string
&
channel
)
:
capacity
(
10
),
channel_name
(
channel
)
{}
Message
Attr
(
size_t
cap
,
const
std
::
string
&
channel
)
Blocker
Attr
(
size_t
cap
,
const
std
::
string
&
channel
)
:
capacity
(
cap
),
channel_name
(
channel
)
{}
MessageAttr
(
const
Message
Attr
&
attr
)
BlockerAttr
(
const
Blocker
Attr
&
attr
)
:
capacity
(
attr
.
capacity
),
channel_name
(
attr
.
channel_name
)
{}
size_t
capacity
;
...
...
@@ -60,7 +60,7 @@ struct MessageAttr {
};
template
<
typename
T
>
class
Message
:
public
Message
Base
{
class
Blocker
:
public
Blocker
Base
{
public:
using
MessageType
=
T
;
using
MessagePtr
=
std
::
shared_ptr
<
T
>
;
...
...
@@ -69,8 +69,8 @@ class Message : public MessageBase {
using
CallbackMap
=
std
::
unordered_map
<
std
::
string
,
Callback
>
;
using
Iterator
=
typename
std
::
list
<
std
::
shared_ptr
<
T
>>::
const_iterator
;
explicit
Message
(
const
Message
Attr
&
attr
);
virtual
~
Message
();
explicit
Blocker
(
const
Blocker
Attr
&
attr
);
virtual
~
Blocker
();
void
Publish
(
const
MessageType
&
msg
);
void
Publish
(
const
MessagePtr
&
msg
);
...
...
@@ -100,7 +100,7 @@ class Message : public MessageBase {
void
Notify
(
const
MessagePtr
&
msg
);
bool
is_full_
;
Message
Attr
attr_
;
Blocker
Attr
attr_
;
MessageQueue
observed_msg_queue_
;
MessageQueue
published_msg_queue_
;
mutable
std
::
mutex
msg_mutex_
;
...
...
@@ -110,52 +110,52 @@ class Message : public MessageBase {
};
template
<
typename
T
>
Message
<
T
>::
Message
(
const
Message
Attr
&
attr
)
:
is_full_
(
false
),
attr_
(
attr
)
{}
Blocker
<
T
>::
Blocker
(
const
Blocker
Attr
&
attr
)
:
is_full_
(
false
),
attr_
(
attr
)
{}
template
<
typename
T
>
Message
<
T
>::~
Message
()
{
Blocker
<
T
>::~
Blocker
()
{
published_msg_queue_
.
clear
();
observed_msg_queue_
.
clear
();
published_callbacks_
.
clear
();
}
template
<
typename
T
>
void
Message
<
T
>::
Publish
(
const
MessageType
&
msg
)
{
void
Blocker
<
T
>::
Publish
(
const
MessageType
&
msg
)
{
Publish
(
std
::
make_shared
<
MessageType
>
(
msg
));
}
template
<
typename
T
>
void
Message
<
T
>::
Publish
(
const
MessagePtr
&
msg
)
{
void
Blocker
<
T
>::
Publish
(
const
MessagePtr
&
msg
)
{
Enqueue
(
msg
);
Notify
(
msg
);
}
template
<
typename
T
>
void
Message
<
T
>::
ClearPublished
()
{
void
Blocker
<
T
>::
ClearPublished
()
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
published_msg_queue_
.
clear
();
}
template
<
typename
T
>
void
Message
<
T
>::
Observe
()
{
void
Blocker
<
T
>::
Observe
()
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
observed_msg_queue_
=
published_msg_queue_
;
}
template
<
typename
T
>
bool
Message
<
T
>::
IsObservedEmpty
()
const
{
bool
Blocker
<
T
>::
IsObservedEmpty
()
const
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
return
observed_msg_queue_
.
empty
();
}
template
<
typename
T
>
bool
Message
<
T
>::
IsPublishedEmpty
()
const
{
bool
Blocker
<
T
>::
IsPublishedEmpty
()
const
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
return
published_msg_queue_
.
empty
();
}
template
<
typename
T
>
bool
Message
<
T
>::
Subscribe
(
const
std
::
string
&
callback_id
,
bool
Blocker
<
T
>::
Subscribe
(
const
std
::
string
&
callback_id
,
const
Callback
&
callback
)
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
cb_mutex_
);
if
(
published_callbacks_
.
find
(
callback_id
)
!=
published_callbacks_
.
end
())
{
...
...
@@ -166,82 +166,82 @@ bool Message<T>::Subscribe(const std::string& callback_id,
}
template
<
typename
T
>
bool
Message
<
T
>::
Unsubscribe
(
const
std
::
string
&
callback_id
)
{
bool
Blocker
<
T
>::
Unsubscribe
(
const
std
::
string
&
callback_id
)
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
cb_mutex_
);
return
published_callbacks_
.
erase
(
callback_id
)
!=
0
;
}
template
<
typename
T
>
auto
Message
<
T
>::
GetLatestObserved
()
const
->
const
MessageType
&
{
auto
Blocker
<
T
>::
GetLatestObserved
()
const
->
const
MessageType
&
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
assert
(
!
observed_msg_queue_
.
empty
());
return
*
observed_msg_queue_
.
back
();
return
*
observed_msg_queue_
.
front
();
}
template
<
typename
T
>
auto
Message
<
T
>::
GetLatestObservedPtr
()
const
->
const
MessagePtr
{
auto
Blocker
<
T
>::
GetLatestObservedPtr
()
const
->
const
MessagePtr
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
assert
(
!
observed_msg_queue_
.
empty
());
return
observed_msg_queue_
.
back
();
return
observed_msg_queue_
.
front
();
}
template
<
typename
T
>
auto
Message
<
T
>::
GetOldestObservedPtr
()
const
->
const
MessagePtr
{
auto
Blocker
<
T
>::
GetOldestObservedPtr
()
const
->
const
MessagePtr
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
assert
(
!
observed_msg_queue_
.
empty
());
return
observed_msg_queue_
.
front
();
return
observed_msg_queue_
.
back
();
}
template
<
typename
T
>
auto
Message
<
T
>::
GetLatestPublishedPtr
()
const
->
const
MessagePtr
{
auto
Blocker
<
T
>::
GetLatestPublishedPtr
()
const
->
const
MessagePtr
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
assert
(
!
published_msg_queue_
.
empty
());
return
published_msg_queue_
.
back
();
return
published_msg_queue_
.
front
();
}
template
<
typename
T
>
auto
Message
<
T
>::
ObservedBegin
()
const
->
Iterator
{
auto
Blocker
<
T
>::
ObservedBegin
()
const
->
Iterator
{
return
observed_msg_queue_
.
begin
();
}
template
<
typename
T
>
auto
Message
<
T
>::
ObservedEnd
()
const
->
Iterator
{
auto
Blocker
<
T
>::
ObservedEnd
()
const
->
Iterator
{
return
observed_msg_queue_
.
end
();
}
template
<
typename
T
>
size_t
Message
<
T
>::
capacity
()
const
{
size_t
Blocker
<
T
>::
capacity
()
const
{
return
attr_
.
capacity
;
}
template
<
typename
T
>
void
Message
<
T
>::
set_capacity
(
size_t
capacity
)
{
void
Blocker
<
T
>::
set_capacity
(
size_t
capacity
)
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
if
(
capacity
>
attr_
.
capacity
)
{
is_full_
=
false
;
}
attr_
.
capacity
=
capacity
;
while
(
published_msg_queue_
.
size
()
>
capacity
)
{
published_msg_queue_
.
pop_
front
();
published_msg_queue_
.
pop_
back
();
}
}
template
<
typename
T
>
const
std
::
string
&
Message
<
T
>::
channel_name
()
const
{
const
std
::
string
&
Blocker
<
T
>::
channel_name
()
const
{
return
attr_
.
channel_name
;
}
template
<
typename
T
>
void
Message
<
T
>::
Enqueue
(
const
MessagePtr
&
msg
)
{
void
Blocker
<
T
>::
Enqueue
(
const
MessagePtr
&
msg
)
{
if
(
attr_
.
capacity
==
0
)
{
return
;
}
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg_mutex_
);
if
(
is_full_
)
{
published_msg_queue_
.
pop_
front
();
published_msg_queue_
.
pop_
back
();
}
published_msg_queue_
.
push_
back
(
msg
);
published_msg_queue_
.
push_
front
(
msg
);
if
(
!
is_full_
)
{
if
(
published_msg_queue_
.
size
()
>=
attr_
.
capacity
)
{
...
...
@@ -251,15 +251,15 @@ void Message<T>::Enqueue(const MessagePtr& msg) {
}
template
<
typename
T
>
void
Message
<
T
>::
Notify
(
const
MessagePtr
&
msg
)
{
void
Blocker
<
T
>::
Notify
(
const
MessagePtr
&
msg
)
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
cb_mutex_
);
for
(
const
auto
&
item
:
published_callbacks_
)
{
item
.
second
(
msg
);
}
}
}
// namespace
dispatch
er
}
// namespace
block
er
}
// namespace cybertron
}
// namespace apollo
#endif // CYBERTRON_
DISPATCHER_MESSAGE
_H_
#endif // CYBERTRON_
BLOCKER_BLOCKER
_H_
framework/cybertron/
dispatcher/dispatch
er.cpp
→
framework/cybertron/
blocker/blocker_manag
er.cpp
浏览文件 @
dd53d485
...
...
@@ -14,23 +14,23 @@
* limitations under the License.
*****************************************************************************/
#include "cybertron/
dispatcher/dispatch
er.h"
#include "cybertron/
blocker/blocker_manag
er.h"
namespace
apollo
{
namespace
cybertron
{
namespace
dispatch
er
{
namespace
block
er
{
Dispatcher
::
Dispatch
er
()
{}
BlockerManager
::
BlockerManag
er
()
{}
Dispatcher
::~
Dispatcher
()
{
message
s_
.
clear
();
}
BlockerManager
::~
BlockerManager
()
{
blocker
s_
.
clear
();
}
void
Dispatch
er
::
Observe
()
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg
_mutex_
);
for
(
auto
&
item
:
message
s_
)
{
void
BlockerManag
er
::
Observe
()
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
blocker
_mutex_
);
for
(
auto
&
item
:
blocker
s_
)
{
item
.
second
->
Observe
();
}
}
}
// namespace
dispatch
er
}
// namespace
block
er
}
// namespace cybertron
}
// namespace apollo
framework/cybertron/
dispatcher/dispatch
er.h
→
framework/cybertron/
blocker/blocker_manag
er.h
浏览文件 @
dd53d485
...
...
@@ -14,142 +14,143 @@
* limitations under the License.
*****************************************************************************/
#ifndef CYBERTRON_
DISPATCHER_DISPATCH
ER_H_
#define CYBERTRON_
DISPATCHER_DISPATCH
ER_H_
#ifndef CYBERTRON_
BLOCKER_BLOCKER_MANAG
ER_H_
#define CYBERTRON_
BLOCKER_BLOCKER_MANAG
ER_H_
#include <memory>
#include <mutex>
#include <string>
#include <unordered_map>
#include "cybertron/
dispatcher/message
.h"
#include "cybertron/
blocker/blocker
.h"
namespace
apollo
{
namespace
cybertron
{
namespace
dispatch
er
{
namespace
block
er
{
class
Dispatch
er
{
class
BlockerManag
er
{
public:
using
Message
Map
=
std
::
unordered_map
<
std
::
string
,
std
::
shared_ptr
<
Message
Base
>>
;
using
Blocker
Map
=
std
::
unordered_map
<
std
::
string
,
std
::
shared_ptr
<
Blocker
Base
>>
;
virtual
~
Dispatch
er
();
virtual
~
BlockerManag
er
();
static
const
std
::
shared_ptr
<
Dispatcher
>&
Instance
()
{
static
auto
instance
=
std
::
shared_ptr
<
Dispatcher
>
(
new
Dispatcher
());
static
const
std
::
shared_ptr
<
BlockerManager
>&
Instance
()
{
static
auto
instance
=
std
::
shared_ptr
<
BlockerManager
>
(
new
BlockerManager
());
return
instance
;
}
template
<
typename
T
>
bool
Publish
(
const
std
::
string
&
channel_name
,
const
typename
Message
<
T
>::
MessagePtr
&
msg
);
const
typename
Blocker
<
T
>::
MessagePtr
&
msg
);
template
<
typename
T
>
bool
Publish
(
const
std
::
string
&
channel_name
,
const
typename
Message
<
T
>::
MessageType
&
msg
);
const
typename
Blocker
<
T
>::
MessageType
&
msg
);
template
<
typename
T
>
bool
Subscribe
(
const
std
::
string
&
channel_name
,
size_t
capacity
,
const
std
::
string
&
callback_id
,
const
typename
Message
<
T
>::
Callback
&
callback
);
const
typename
Blocker
<
T
>::
Callback
&
callback
);
template
<
typename
T
>
bool
Unsubscribe
(
const
std
::
string
&
channel_name
,
const
std
::
string
&
callback_id
);
template
<
typename
T
>
std
::
shared_ptr
<
Message
<
T
>>
GetMessage
(
const
std
::
string
&
channel_name
);
std
::
shared_ptr
<
Blocker
<
T
>>
GetBlocker
(
const
std
::
string
&
channel_name
);
template
<
typename
T
>
std
::
shared_ptr
<
Message
<
T
>>
GetOrCreateMessage
(
const
Message
Attr
&
attr
);
std
::
shared_ptr
<
Blocker
<
T
>>
GetOrCreateBlocker
(
const
Blocker
Attr
&
attr
);
void
Observe
();
private:
Dispatch
er
();
Dispatcher
(
const
Dispatch
er
&
)
=
delete
;
Dispatcher
&
operator
=
(
const
Dispatch
er
&
)
=
delete
;
BlockerManag
er
();
BlockerManager
(
const
BlockerManag
er
&
)
=
delete
;
BlockerManager
&
operator
=
(
const
BlockerManag
er
&
)
=
delete
;
MessageMap
message
s_
;
std
::
mutex
msg
_mutex_
;
BlockerMap
blocker
s_
;
std
::
mutex
blocker
_mutex_
;
};
template
<
typename
T
>
bool
Dispatch
er
::
Publish
(
const
std
::
string
&
channel_name
,
const
typename
Message
<
T
>::
MessagePtr
&
msg
)
{
auto
message
=
GetOrCreateMessage
<
T
>
(
Message
Attr
(
channel_name
));
if
(
message
==
nullptr
)
{
bool
BlockerManag
er
::
Publish
(
const
std
::
string
&
channel_name
,
const
typename
Blocker
<
T
>::
MessagePtr
&
msg
)
{
auto
blocker
=
GetOrCreateBlocker
<
T
>
(
Blocker
Attr
(
channel_name
));
if
(
blocker
==
nullptr
)
{
return
false
;
}
message
->
Publish
(
msg
);
blocker
->
Publish
(
msg
);
return
true
;
}
template
<
typename
T
>
bool
Dispatch
er
::
Publish
(
const
std
::
string
&
channel_name
,
const
typename
Message
<
T
>::
MessageType
&
msg
)
{
auto
message
=
GetOrCreateMessage
<
T
>
(
Message
Attr
(
channel_name
));
if
(
message
==
nullptr
)
{
bool
BlockerManag
er
::
Publish
(
const
std
::
string
&
channel_name
,
const
typename
Blocker
<
T
>::
MessageType
&
msg
)
{
auto
blocker
=
GetOrCreateBlocker
<
T
>
(
Blocker
Attr
(
channel_name
));
if
(
blocker
==
nullptr
)
{
return
false
;
}
message
->
Publish
(
msg
);
blocker
->
Publish
(
msg
);
return
true
;
}
template
<
typename
T
>
bool
Dispatch
er
::
Subscribe
(
const
std
::
string
&
channel_name
,
size_t
capacity
,
const
std
::
string
&
callback_id
,
const
typename
Message
<
T
>::
Callback
&
callback
)
{
auto
message
=
GetOrCreateMessage
<
T
>
(
Message
Attr
(
capacity
,
channel_name
));
if
(
message
==
nullptr
)
{
bool
BlockerManag
er
::
Subscribe
(
const
std
::
string
&
channel_name
,
size_t
capacity
,
const
std
::
string
&
callback_id
,
const
typename
Blocker
<
T
>::
Callback
&
callback
)
{
auto
blocker
=
GetOrCreateBlocker
<
T
>
(
Blocker
Attr
(
capacity
,
channel_name
));
if
(
blocker
==
nullptr
)
{
return
false
;
}
return
message
->
Subscribe
(
callback_id
,
callback
);
return
blocker
->
Subscribe
(
callback_id
,
callback
);
}
template
<
typename
T
>
bool
Dispatch
er
::
Unsubscribe
(
const
std
::
string
&
channel_name
,
const
std
::
string
&
callback_id
)
{
auto
message
=
GetMessage
<
T
>
(
channel_name
);
if
(
message
==
nullptr
)
{
bool
BlockerManag
er
::
Unsubscribe
(
const
std
::
string
&
channel_name
,
const
std
::
string
&
callback_id
)
{
auto
blocker
=
GetBlocker
<
T
>
(
channel_name
);
if
(
blocker
==
nullptr
)
{
return
false
;
}
return
message
->
Unsubscribe
(
callback_id
);
return
blocker
->
Unsubscribe
(
callback_id
);
}
template
<
typename
T
>
std
::
shared_ptr
<
Message
<
T
>>
Dispatcher
::
GetMessage
(
std
::
shared_ptr
<
Blocker
<
T
>>
BlockerManager
::
GetBlocker
(
const
std
::
string
&
channel_name
)
{
std
::
shared_ptr
<
Message
<
T
>>
message
=
nullptr
;
std
::
shared_ptr
<
Blocker
<
T
>>
blocker
=
nullptr
;
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg
_mutex_
);
auto
search
=
message
s_
.
find
(
channel_name
);
if
(
search
!=
message
s_
.
end
())
{
message
=
std
::
dynamic_pointer_cast
<
Message
<
T
>>
(
search
->
second
);
std
::
lock_guard
<
std
::
mutex
>
lock
(
blocker
_mutex_
);
auto
search
=
blocker
s_
.
find
(
channel_name
);
if
(
search
!=
blocker
s_
.
end
())
{
blocker
=
std
::
dynamic_pointer_cast
<
Blocker
<
T
>>
(
search
->
second
);
}
}
return
message
;
return
blocker
;
}
template
<
typename
T
>
std
::
shared_ptr
<
Message
<
T
>>
Dispatcher
::
GetOrCreateMessage
(
const
Message
Attr
&
attr
)
{
std
::
shared_ptr
<
Message
<
T
>>
message
=
nullptr
;
std
::
shared_ptr
<
Blocker
<
T
>>
BlockerManager
::
GetOrCreateBlocker
(
const
Blocker
Attr
&
attr
)
{
std
::
shared_ptr
<
Blocker
<
T
>>
blocker
=
nullptr
;
{
std
::
lock_guard
<
std
::
mutex
>
lock
(
msg
_mutex_
);
auto
search
=
message
s_
.
find
(
attr
.
channel_name
);
if
(
search
!=
message
s_
.
end
())
{
message
=
std
::
dynamic_pointer_cast
<
Message
<
T
>>
(
search
->
second
);
std
::
lock_guard
<
std
::
mutex
>
lock
(
blocker
_mutex_
);
auto
search
=
blocker
s_
.
find
(
attr
.
channel_name
);
if
(
search
!=
blocker
s_
.
end
())
{
blocker
=
std
::
dynamic_pointer_cast
<
Blocker
<
T
>>
(
search
->
second
);
}
else
{
message
=
std
::
make_shared
<
Message
<
T
>>
(
attr
);
messages_
[
attr
.
channel_name
]
=
message
;
blocker
=
std
::
make_shared
<
Blocker
<
T
>>
(
attr
);
blockers_
[
attr
.
channel_name
]
=
blocker
;
}
}
return
message
;
return
blocker
;
}
}
// namespace
dispatch
er
}
// namespace
block
er
}
// namespace cybertron
}
// namespace apollo
#endif // CYBERTRON_
DISPATCHER_DISPATCH
ER_H_
#endif // CYBERTRON_
BLOCKER_BLOCKER_MANAG
ER_H_
framework/cybertron/
dispatch
er/intra_reader.h
→
framework/cybertron/
block
er/intra_reader.h
浏览文件 @
dd53d485
...
...
@@ -14,19 +14,20 @@
* limitations under the License.
*****************************************************************************/
#ifndef CYBERTRON_
DISPATCH
ER_INTRA_READER_H_
#define CYBERTRON_
DISPATCH
ER_INTRA_READER_H_
#ifndef CYBERTRON_
BLOCK
ER_INTRA_READER_H_
#define CYBERTRON_
BLOCK
ER_INTRA_READER_H_
#include <functional>
#include <list>
#include <memory>
#include "cybertron/dispatcher/dispatcher.h"
#include "cybertron/blocker/blocker.h"
#include "cybertron/blocker/blocker_manager.h"
#include "cybertron/node/reader.h"
namespace
apollo
{
namespace
cybertron
{
namespace
dispatch
er
{
namespace
block
er
{
template
<
typename
MessageT
>
class
IntraReader
:
public
apollo
::
cybertron
::
Reader
<
MessageT
>
{
...
...
@@ -59,13 +60,13 @@ class IntraReader : public apollo::cybertron::Reader<MessageT> {
void
OnMessage
(
const
MessagePtr
&
msg_ptr
);
Callback
msg_callback_
;
std
::
shared_ptr
<
Message
<
MessageT
>>
message
_
;
std
::
shared_ptr
<
Blocker
<
MessageT
>>
blocker
_
;
};
template
<
typename
MessageT
>
IntraReader
<
MessageT
>::
IntraReader
(
const
proto
::
RoleAttributes
&
attr
,
const
Callback
&
callback
)
:
Reader
<
MessageT
>
(
attr
),
msg_callback_
(
callback
),
message
_
(
nullptr
)
{}
:
Reader
<
MessageT
>
(
attr
),
msg_callback_
(
callback
),
blocker
_
(
nullptr
)
{}
template
<
typename
MessageT
>
IntraReader
<
MessageT
>::~
IntraReader
()
{
...
...
@@ -77,13 +78,13 @@ bool IntraReader<MessageT>::Init() {
if
(
this
->
init_
.
exchange
(
true
))
{
return
true
;
}
Message
Attr
attr
(
this
->
role_attr_
.
qos_profile
().
depth
(),
Blocker
Attr
attr
(
this
->
role_attr_
.
qos_profile
().
depth
(),
this
->
role_attr_
.
channel_name
());
message_
=
Dispatcher
::
Instance
()
->
GetOrCreateMessage
<
MessageT
>
(
attr
);
if
(
message
_
==
nullptr
)
{
blocker_
=
BlockerManager
::
Instance
()
->
GetOrCreateBlocker
<
MessageT
>
(
attr
);
if
(
blocker
_
==
nullptr
)
{
return
false
;
}
return
message
_
->
Subscribe
(
this
->
role_attr_
.
node_name
(),
return
blocker
_
->
Subscribe
(
this
->
role_attr_
.
node_name
(),
std
::
bind
(
&
IntraReader
<
MessageT
>::
OnMessage
,
this
,
std
::
placeholders
::
_1
));
}
...
...
@@ -93,94 +94,94 @@ void IntraReader<MessageT>::Shutdown() {
if
(
!
this
->
init_
.
exchange
(
false
))
{
return
;
}
message
_
->
Unsubscribe
(
this
->
role_attr_
.
node_name
());
message
_
=
nullptr
;
blocker
_
->
Unsubscribe
(
this
->
role_attr_
.
node_name
());
blocker
_
=
nullptr
;
}
template
<
typename
MessageT
>
void
IntraReader
<
MessageT
>::
ClearData
()
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
;
}
message
_
->
ClearPublished
();
blocker
_
->
ClearPublished
();
}
template
<
typename
MessageT
>
void
IntraReader
<
MessageT
>::
Observe
()
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
;
}
message
_
->
Observe
();
blocker
_
->
Observe
();
}
template
<
typename
MessageT
>
bool
IntraReader
<
MessageT
>::
Empty
()
const
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
true
;
}
return
message
_
->
IsObservedEmpty
();
return
blocker
_
->
IsObservedEmpty
();
}
template
<
typename
MessageT
>
bool
IntraReader
<
MessageT
>::
HasReceived
()
const
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
false
;
}
return
!
message
_
->
IsPublishedEmpty
();
return
!
blocker
_
->
IsPublishedEmpty
();
}
template
<
typename
MessageT
>
void
IntraReader
<
MessageT
>::
Enqueue
(
const
std
::
shared_ptr
<
MessageT
>&
msg
)
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
;
}
message
_
->
Publish
(
msg
);
blocker
_
->
Publish
(
msg
);
}
template
<
typename
MessageT
>
void
IntraReader
<
MessageT
>::
SetHistoryDepth
(
const
uint32_t
&
depth
)
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
;
}
message
_
->
set_capacity
(
depth
);
blocker
_
->
set_capacity
(
depth
);
}
template
<
typename
MessageT
>
uint32_t
IntraReader
<
MessageT
>::
GetHistoryDepth
()
const
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
0
;
}
return
message
_
->
capacity
();
return
blocker
_
->
capacity
();
}
template
<
typename
MessageT
>
const
std
::
shared_ptr
<
MessageT
>&
IntraReader
<
MessageT
>::
GetLatestObserved
()
const
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
nullptr
;
}
return
message
_
->
GetLatestObservedPtr
();
return
blocker
_
->
GetLatestObservedPtr
();
}
template
<
typename
MessageT
>
const
std
::
shared_ptr
<
MessageT
>&
IntraReader
<
MessageT
>::
GetOldestObserved
()
const
{
if
(
message
_
==
nullptr
)
{
if
(
blocker
_
==
nullptr
)
{
return
nullptr
;
}
return
message
_
->
GetOldestObservedPtr
();
return
blocker
_
->
GetOldestObservedPtr
();
}
template
<
typename
MessageT
>
auto
IntraReader
<
MessageT
>::
Begin
()
const
->
Iterator
{
assert
(
message
_
!=
nullptr
);
return
message
_
->
ObservedBegin
();
assert
(
blocker
_
!=
nullptr
);
return
blocker
_
->
ObservedBegin
();
}
template
<
typename
MessageT
>
auto
IntraReader
<
MessageT
>::
End
()
const
->
Iterator
{
assert
(
message
_
!=
nullptr
);
return
message
_
->
ObservedEnd
();
assert
(
blocker
_
!=
nullptr
);
return
blocker
_
->
ObservedEnd
();
}
template
<
typename
MessageT
>
...
...
@@ -190,8 +191,8 @@ void IntraReader<MessageT>::OnMessage(const MessagePtr& msg_ptr) {
}
}
}
// namespace
dispatch
er
}
// namespace
block
er
}
// namespace cybertron
}
// namespace apollo
#endif // CYBERTRON_
DISPATCH
ER_INTRA_READER_H_
#endif // CYBERTRON_
BLOCK
ER_INTRA_READER_H_
framework/cybertron/
dispatch
er/intra_writer.h
→
framework/cybertron/
block
er/intra_writer.h
浏览文件 @
dd53d485
...
...
@@ -14,23 +14,23 @@
* limitations under the License.
*****************************************************************************/
#ifndef CYBERTRON_
DISPATCH
ER_INTRA_WRITER_H_
#define CYBERTRON_
DISPATCH
ER_INTRA_WRITER_H_
#ifndef CYBERTRON_
BLOCK
ER_INTRA_WRITER_H_
#define CYBERTRON_
BLOCK
ER_INTRA_WRITER_H_
#include <memory>
#include "cybertron/dispatcher/dispatcher.h"
#include "cybertron/blocker/blocker.h"
#include "cybertron/blocker/blocker_manager.h"
#include "cybertron/node/writer.h"
namespace
apollo
{
namespace
cybertron
{
namespace
dispatch
er
{
namespace
block
er
{
template
<
typename
MessageT
>
class
IntraWriter
:
public
apollo
::
cybertron
::
Writer
<
MessageT
>
{
public:
using
MessagePtr
=
std
::
shared_ptr
<
MessageT
>
;
using
DispatcherPtr
=
std
::
shared_ptr
<
dispatcher
::
Dispatcher
>
;
explicit
IntraWriter
(
const
proto
::
RoleAttributes
&
attr
);
virtual
~
IntraWriter
();
...
...
@@ -42,14 +42,12 @@ class IntraWriter : public apollo::cybertron::Writer<MessageT> {
bool
Write
(
const
MessagePtr
&
msg_ptr
)
override
;
private:
DispatcherPtr
dispatch
er_
;
std
::
shared_ptr
<
Blocker
<
MessageT
>>
block
er_
;
};
template
<
typename
MessageT
>
IntraWriter
<
MessageT
>::
IntraWriter
(
const
proto
::
RoleAttributes
&
attr
)
:
Writer
<
MessageT
>
(
attr
)
{
dispatcher_
=
dispatcher
::
Dispatcher
::
Instance
();
}
:
Writer
<
MessageT
>
(
attr
)
{}
template
<
typename
MessageT
>
IntraWriter
<
MessageT
>::~
IntraWriter
()
{
...
...
@@ -58,13 +56,25 @@ IntraWriter<MessageT>::~IntraWriter() {
template
<
typename
MessageT
>
bool
IntraWriter
<
MessageT
>::
Init
()
{
this
->
init_
.
exchange
(
true
);
if
(
this
->
init_
.
exchange
(
true
))
{
return
true
;
}
BlockerAttr
attr
(
this
->
role_attr_
.
channel_name
());
blocker_
=
BlockerManager
::
Instance
()
->
GetOrCreateBlocker
<
MessageT
>
(
attr
);
if
(
blocker_
==
nullptr
)
{
this
->
init_
.
exchange
(
false
);
return
false
;
}
return
true
;
}
template
<
typename
MessageT
>
void
IntraWriter
<
MessageT
>::
Shutdown
()
{
this
->
init_
.
exchange
(
false
);
if
(
!
this
->
init_
.
exchange
(
false
))
{
return
;
}
blocker_
=
nullptr
;
}
template
<
typename
MessageT
>
...
...
@@ -72,7 +82,8 @@ bool IntraWriter<MessageT>::Write(const MessageT& msg) {
if
(
!
this
->
init_
.
load
())
{
return
false
;
}
return
Write
(
std
::
make_shared
<
MessageT
>
(
msg
));
blocker_
->
Publish
(
msg
);
return
true
;
}
template
<
typename
MessageT
>
...
...
@@ -80,12 +91,12 @@ bool IntraWriter<MessageT>::Write(const MessagePtr& msg_ptr) {
if
(
!
this
->
init_
.
load
())
{
return
false
;
}
return
dispatcher_
->
Publish
<
MessageT
>
(
this
->
role_attr_
.
channel_name
(),
msg_ptr
)
;
blocker_
->
Publish
(
msg_ptr
);
return
true
;
}
}
// namespace
dispatch
er
}
// namespace
block
er
}
// namespace cybertron
}
// namespace apollo
#endif // CYBERTRON_
DISPATCH
ER_INTRA_WRITER_H_
#endif // CYBERTRON_
BLOCK
ER_INTRA_WRITER_H_
framework/cybertron/component/component.h
浏览文件 @
dd53d485
...
...
@@ -21,13 +21,13 @@
#include <utility>
#include <vector>
#include "cybertron/blocker/blocker_manager.h"
#include "cybertron/common/global_data.h"
#include "cybertron/common/types.h"
#include "cybertron/common/util.h"
#include "cybertron/component/component_base.h"
#include "cybertron/croutine/routine_factory.h"
#include "cybertron/data/data_visitor.h"
#include "cybertron/proto/run_mode_conf.pb.h"
#include "cybertron/scheduler/scheduler.h"
namespace
apollo
{
...
...
@@ -218,14 +218,14 @@ bool Component<M0, M1, NullType, NullType>::Initialize(
std
::
weak_ptr
<
Component
<
M0
,
M1
>>
self
=
std
::
dynamic_pointer_cast
<
Component
<
M0
,
M1
>>
(
shared_from_this
());
auto
message1
=
dispatcher
::
Dispatcher
::
Instance
()
->
GetMessage
<
M1
>
(
auto
blocker1
=
blocker
::
BlockerManager
::
Instance
()
->
GetBlocker
<
M1
>
(
config
.
readers
(
1
).
channel
());
auto
func
=
[
self
,
message
1
](
const
std
::
shared_ptr
<
M0
>&
msg0
)
{
auto
func
=
[
self
,
blocker
1
](
const
std
::
shared_ptr
<
M0
>&
msg0
)
{
auto
ptr
=
self
.
lock
();
if
(
ptr
)
{
if
(
!
message
1
->
IsPublishedEmpty
())
{
auto
msg1
=
message
1
->
GetLatestPublishedPtr
();
if
(
!
blocker
1
->
IsPublishedEmpty
())
{
auto
msg1
=
blocker
1
->
GetLatestPublishedPtr
();
ptr
->
Process
(
msg0
,
msg1
);
}
}
else
{
...
...
@@ -307,17 +307,17 @@ bool Component<M0, M1, M2, NullType>::Initialize(
std
::
dynamic_pointer_cast
<
Component
<
M0
,
M1
,
M2
,
NullType
>>
(
shared_from_this
());
auto
message1
=
dispatcher
::
Dispatcher
::
Instance
()
->
GetMessage
<
M1
>
(
auto
blocker1
=
blocker
::
BlockerManager
::
Instance
()
->
GetBlocker
<
M1
>
(
config
.
readers
(
1
).
channel
());
auto
message2
=
dispatcher
::
Dispatcher
::
Instance
()
->
GetMessage
<
M2
>
(
auto
blocker2
=
blocker
::
BlockerManager
::
Instance
()
->
GetBlocker
<
M2
>
(
config
.
readers
(
2
).
channel
());
auto
func
=
[
self
,
message1
,
message
2
](
const
std
::
shared_ptr
<
M0
>&
msg0
)
{
auto
func
=
[
self
,
blocker1
,
blocker
2
](
const
std
::
shared_ptr
<
M0
>&
msg0
)
{
auto
ptr
=
self
.
lock
();
if
(
ptr
)
{
if
(
!
message1
->
IsPublishedEmpty
()
&&
!
message
2
->
IsPublishedEmpty
())
{
auto
msg1
=
message
1
->
GetLatestPublishedPtr
();
auto
msg2
=
message
2
->
GetLatestPublishedPtr
();
if
(
!
blocker1
->
IsPublishedEmpty
()
&&
!
blocker
2
->
IsPublishedEmpty
())
{
auto
msg1
=
blocker
1
->
GetLatestPublishedPtr
();
auto
msg2
=
blocker
2
->
GetLatestPublishedPtr
();
ptr
->
Process
(
msg0
,
msg1
,
msg2
);
}
}
else
{
...
...
@@ -404,22 +404,22 @@ bool Component<M0, M1, M2, M3>::Initialize(const ComponentConfig& config) {
std
::
dynamic_pointer_cast
<
Component
<
M0
,
M1
,
M2
,
M3
>>
(
shared_from_this
());
auto
message1
=
dispatcher
::
Dispatcher
::
Instance
()
->
GetMessage
<
M1
>
(
auto
blocker1
=
blocker
::
BlockerManager
::
Instance
()
->
GetBlocker
<
M1
>
(
config
.
readers
(
1
).
channel
());
auto
message2
=
dispatcher
::
Dispatcher
::
Instance
()
->
GetMessage
<
M2
>
(
auto
blocker2
=
blocker
::
BlockerManager
::
Instance
()
->
GetBlocker
<
M2
>
(
config
.
readers
(
2
).
channel
());
auto
message3
=
dispatcher
::
Dispatcher
::
Instance
()
->
GetMessage
<
M3
>
(
auto
blocker3
=
blocker
::
BlockerManager
::
Instance
()
->
GetBlocker
<
M3
>
(
config
.
readers
(
3
).
channel
());
auto
func
=
[
self
,
message1
,
message
2
,
message
3
](
const
std
::
shared_ptr
<
M0
>&
msg0
)
{
auto
func
=
[
self
,
blocker1
,
blocker
2
,
blocker
3
](
const
std
::
shared_ptr
<
M0
>&
msg0
)
{
auto
ptr
=
self
.
lock
();
if
(
ptr
)
{
if
(
!
message1
->
IsPublishedEmpty
()
&&
!
message
2
->
IsPublishedEmpty
()
&&
!
message
3
->
IsPublishedEmpty
())
{
auto
msg1
=
message
1
->
GetLatestPublishedPtr
();
auto
msg2
=
message
2
->
GetLatestPublishedPtr
();
auto
msg3
=
message
3
->
GetLatestPublishedPtr
();
if
(
!
blocker1
->
IsPublishedEmpty
()
&&
!
blocker
2
->
IsPublishedEmpty
()
&&
!
blocker
3
->
IsPublishedEmpty
())
{
auto
msg1
=
blocker
1
->
GetLatestPublishedPtr
();
auto
msg2
=
blocker
2
->
GetLatestPublishedPtr
();
auto
msg3
=
blocker
3
->
GetLatestPublishedPtr
();
ptr
->
Process
(
msg0
,
msg1
,
msg2
,
msg3
);
}
}
else
{
...
...
@@ -447,16 +447,16 @@ bool Component<M0, M1, M2, M3>::Initialize(const ComponentConfig& config) {
auto
sched
=
scheduler
::
Scheduler
::
Instance
();
std
::
weak_ptr
<
Component
<
M0
,
M1
,
M2
,
M3
>>
self
=
std
::
dynamic_pointer_cast
<
Component
<
M0
,
M1
,
M2
,
M3
>>
(
shared_from_this
());
auto
func
=
[
self
](
const
std
::
shared_ptr
<
M0
>&
msg0
,
const
std
::
shared_ptr
<
M1
>&
msg1
,
const
std
::
shared_ptr
<
M2
>&
msg2
,
const
std
::
shared_ptr
<
M3
>&
msg3
)
{
auto
ptr
=
self
.
lock
();
if
(
ptr
)
{
ptr
->
Process
(
msg0
,
msg1
,
msg2
,
msg3
);
}
else
{
AERROR
<<
"Component object has been destroyed."
<<
std
::
endl
;
}
};
auto
func
=
[
self
](
const
std
::
shared_ptr
<
M0
>&
msg0
,
const
std
::
shared_ptr
<
M1
>&
msg1
,
const
std
::
shared_ptr
<
M2
>&
msg2
,
const
std
::
shared_ptr
<
M3
>&
msg3
)
{
auto
ptr
=
self
.
lock
();
if
(
ptr
)
{
ptr
->
Process
(
msg0
,
msg1
,
msg2
,
msg3
);
}
else
{
AERROR
<<
"Component object has been destroyed."
<<
std
::
endl
;
}
};
auto
dv
=
std
::
make_shared
<
data
::
DataVisitor
<
M0
,
M1
,
M2
,
M3
>>
(
readers_
);
croutine
::
RoutineFactory
factory
=
...
...
framework/cybertron/dispatcher/CMakeLists.txt
已删除
100644 → 0
浏览文件 @
6046b544
project
(
cybertron_dispatcher
)
aux_source_directory
(
${
PROJECT_SOURCE_DIR
}
DISPATCHER_SRCS
)
add_library
(
${
PROJECT_NAME
}
${
DISPATCHER_SRCS
}
)
install
(
TARGETS cybertron_dispatcher LIBRARY DESTINATION lib
)
framework/cybertron/node/node_channel_impl.h
浏览文件 @
dd53d485
...
...
@@ -20,9 +20,9 @@
#include <memory>
#include <string>
#include "cybertron/blocker/intra_reader.h"
#include "cybertron/blocker/intra_writer.h"
#include "cybertron/common/global_data.h"
#include "cybertron/dispatcher/intra_reader.h"
#include "cybertron/dispatcher/intra_writer.h"
#include "cybertron/message/message_traits.h"
#include "cybertron/node/reader.h"
#include "cybertron/node/writer.h"
...
...
@@ -104,7 +104,7 @@ auto NodeChannelImpl::CreateWriter(const proto::RoleAttributes& role_attr)
std
::
shared_ptr
<
Writer
<
MessageT
>>
writer_ptr
=
nullptr
;
if
(
!
is_reality_mode_
)
{
writer_ptr
=
std
::
make_shared
<
dispatch
er
::
IntraWriter
<
MessageT
>>
(
new_attr
);
writer_ptr
=
std
::
make_shared
<
block
er
::
IntraWriter
<
MessageT
>>
(
new_attr
);
}
else
{
writer_ptr
=
std
::
make_shared
<
Writer
<
MessageT
>>
(
new_attr
);
}
...
...
@@ -141,8 +141,8 @@ auto NodeChannelImpl::CreateReader(const proto::RoleAttributes& role_attr,
std
::
shared_ptr
<
Reader
<
MessageT
>>
reader_ptr
=
nullptr
;
if
(
!
is_reality_mode_
)
{
reader_ptr
=
std
::
make_shared
<
dispatcher
::
IntraReader
<
MessageT
>>
(
new_attr
,
reader_func
);
reader_ptr
=
std
::
make_shared
<
blocker
::
IntraReader
<
MessageT
>>
(
new_attr
,
reader_func
);
}
else
{
reader_ptr
=
std
::
make_shared
<
Reader
<
MessageT
>>
(
new_attr
,
reader_func
);
}
...
...
framework/cybertron/test/CMakeLists.txt
浏览文件 @
dd53d485
...
...
@@ -21,4 +21,4 @@ add_subdirectory(tools)
add_subdirectory
(
record
)
add_subdirectory
(
component
)
add_subdirectory
(
mainboard
)
add_subdirectory
(
dispatch
er
)
add_subdirectory
(
block
er
)
framework/cybertron/test/blocker/CMakeLists.txt
0 → 100644
浏览文件 @
dd53d485
project
(
blocker_test
)
add_executable
(
blocker_test
blocker_test.cpp
)
target_link_libraries
(
blocker_test
cybertron
cybertron_blocker
gtest
)
add_executable
(
blocker_manager_test
blocker_manager_test.cpp
)
target_link_libraries
(
blocker_manager_test
cybertron
cybertron_blocker
gtest
)
install
(
TARGETS
blocker_test
blocker_manager_test
DESTINATION
${
UNIT_TEST_INSTALL_PREFIX
}
)
\ No newline at end of file
framework/cybertron/test/
dispatcher/dispatch
er_test.cpp
→
framework/cybertron/test/
blocker/blocker_manag
er_test.cpp
浏览文件 @
dd53d485
...
...
@@ -16,59 +16,59 @@
#include "gtest/gtest.h"
#include "cybertron/
dispatcher/dispatch
er.h"
#include "cybertron/
blocker/blocker_manag
er.h"
#include "cybertron/proto/unit_test.pb.h"
namespace
apollo
{
namespace
cybertron
{
namespace
dispatch
er
{
namespace
block
er
{
using
apollo
::
cybertron
::
proto
::
UnitTest
;
TEST
(
Dispatch
erTest
,
constructor
)
{
Dispatcher
dispatch
er
;
auto
msg
=
dispatcher
.
GetMessage
<
UnitTest
>
(
"channel"
);
EXPECT_EQ
(
msg
,
nullptr
);
TEST
(
BlockerManag
erTest
,
constructor
)
{
BlockerManager
blocker_manag
er
;
auto
blocker
=
blocker_manager
.
GetBlocker
<
UnitTest
>
(
"channel"
);
EXPECT_EQ
(
blocker
,
nullptr
);
}
TEST
(
Dispatch
erTest
,
publish
)
{
Dispatcher
dispatch
er
;
TEST
(
BlockerManag
erTest
,
publish
)
{
BlockerManager
blocker_manag
er
;
auto
msg1
=
std
::
make_shared
<
UnitTest
>
();
msg1
->
set_class_name
(
"MessageTest"
);
msg1
->
set_case_name
(
"publish_1"
);
dispatch
er
.
Publish
<
UnitTest
>
(
"channel1"
,
msg1
);
auto
message1
=
dispatcher
.
GetMessage
<
UnitTest
>
(
"channel1"
);
EXPECT_NE
(
message
1
,
nullptr
);
EXPECT_FALSE
(
message
1
->
IsPublishedEmpty
());
blocker_manag
er
.
Publish
<
UnitTest
>
(
"channel1"
,
msg1
);
auto
blocker1
=
blocker_manager
.
GetBlocker
<
UnitTest
>
(
"channel1"
);
EXPECT_NE
(
blocker
1
,
nullptr
);
EXPECT_FALSE
(
blocker
1
->
IsPublishedEmpty
());
UnitTest
msg2
;
msg2
.
set_class_name
(
"MessageTest"
);
msg2
.
set_case_name
(
"publish_2"
);
dispatch
er
.
Publish
<
UnitTest
>
(
"channel2"
,
msg2
);
auto
message2
=
dispatcher
.
GetMessage
<
UnitTest
>
(
"channel2"
);
EXPECT_NE
(
message
2
,
nullptr
);
EXPECT_FALSE
(
message
2
->
IsPublishedEmpty
());
blocker_manag
er
.
Publish
<
UnitTest
>
(
"channel2"
,
msg2
);
auto
blocker2
=
blocker_manager
.
GetBlocker
<
UnitTest
>
(
"channel2"
);
EXPECT_NE
(
blocker
2
,
nullptr
);
EXPECT_FALSE
(
blocker
2
->
IsPublishedEmpty
());
EXPECT_TRUE
(
message
1
->
IsObservedEmpty
());
EXPECT_TRUE
(
message
2
->
IsObservedEmpty
());
EXPECT_TRUE
(
blocker
1
->
IsObservedEmpty
());
EXPECT_TRUE
(
blocker
2
->
IsObservedEmpty
());
dispatch
er
.
Observe
();
blocker_manag
er
.
Observe
();
EXPECT_FALSE
(
message
1
->
IsObservedEmpty
());
EXPECT_FALSE
(
message
2
->
IsObservedEmpty
());
EXPECT_FALSE
(
blocker
1
->
IsObservedEmpty
());
EXPECT_FALSE
(
blocker
2
->
IsObservedEmpty
());
}
TEST
(
Dispatch
erTest
,
subscribe
)
{
Dispatcher
dispatch
er
;
TEST
(
BlockerManag
erTest
,
subscribe
)
{
BlockerManager
blocker_manag
er
;
auto
received_msg
=
std
::
make_shared
<
UnitTest
>
();
bool
res
=
dispatch
er
.
Subscribe
<
UnitTest
>
(
"channel"
,
10
,
"
Dispatch
erTest"
,
[
&
received_msg
](
const
std
::
shared_ptr
<
UnitTest
>&
msg
)
{
received_msg
->
CopyFrom
(
*
msg
);
bool
res
=
blocker_manag
er
.
Subscribe
<
UnitTest
>
(
"channel"
,
10
,
"
BlockerManag
erTest"
,
[
&
received_msg
](
const
std
::
shared_ptr
<
UnitTest
>&
blocker
)
{
received_msg
->
CopyFrom
(
*
blocker
);
});
EXPECT_TRUE
(
res
);
...
...
@@ -77,24 +77,26 @@ TEST(DispatcherTest, subscribe) {
msg1
->
set_class_name
(
"MessageTest"
);
msg1
->
set_case_name
(
"publish_1"
);
dispatch
er
.
Publish
<
UnitTest
>
(
"channel"
,
msg1
);
blocker_manag
er
.
Publish
<
UnitTest
>
(
"channel"
,
msg1
);
EXPECT_EQ
(
received_msg
->
class_name
(),
msg1
->
class_name
());
EXPECT_EQ
(
received_msg
->
case_name
(),
msg1
->
case_name
());
res
=
dispatcher
.
Unsubscribe
<
UnitTest
>
(
"channel"
,
"Dispatch
erTest"
);
res
=
blocker_manager
.
Unsubscribe
<
UnitTest
>
(
"channel"
,
"BlockerManag
erTest"
);
EXPECT_TRUE
(
res
);
res
=
dispatcher
.
Unsubscribe
<
UnitTest
>
(
"channel"
,
"Dispatch
erTest"
);
res
=
blocker_manager
.
Unsubscribe
<
UnitTest
>
(
"channel"
,
"BlockerManag
erTest"
);
EXPECT_FALSE
(
res
);
res
=
dispatcher
.
Unsubscribe
<
UnitTest
>
(
"channel"
,
"DispatcherTest_11"
);
res
=
blocker_manager
.
Unsubscribe
<
UnitTest
>
(
"channel"
,
"BlockerManagerTest_11"
);
EXPECT_FALSE
(
res
);
res
=
dispatcher
.
Unsubscribe
<
UnitTest
>
(
"channel_11"
,
"DispatcherTest"
);
res
=
blocker_manager
.
Unsubscribe
<
UnitTest
>
(
"channel_11"
,
"BlockerManagerTest"
);
EXPECT_FALSE
(
res
);
}
}
// namespace
dispatch
er
}
// namespace
block
er
}
// namespace cybertron
}
// namespace apollo
...
...
framework/cybertron/test/
dispatcher/message
_test.cpp
→
framework/cybertron/test/
blocker/blocker
_test.cpp
浏览文件 @
dd53d485
...
...
@@ -16,105 +16,105 @@
#include "gtest/gtest.h"
#include "cybertron/
dispatcher/message
.h"
#include "cybertron/
blocker/blocker
.h"
#include "cybertron/proto/unit_test.pb.h"
namespace
apollo
{
namespace
cybertron
{
namespace
dispatch
er
{
namespace
block
er
{
using
apollo
::
cybertron
::
proto
::
UnitTest
;
TEST
(
Message
Test
,
constructor
)
{
Message
Attr
attr
(
10
,
"channel"
);
Message
<
UnitTest
>
message
(
attr
);
EXPECT_EQ
(
message
.
capacity
(),
10
);
EXPECT_EQ
(
message
.
channel_name
(),
"channel"
);
TEST
(
Blocker
Test
,
constructor
)
{
Blocker
Attr
attr
(
10
,
"channel"
);
Blocker
<
UnitTest
>
blocker
(
attr
);
EXPECT_EQ
(
blocker
.
capacity
(),
10
);
EXPECT_EQ
(
blocker
.
channel_name
(),
"channel"
);
message
.
set_capacity
(
20
);
EXPECT_EQ
(
message
.
capacity
(),
20
);
blocker
.
set_capacity
(
20
);
EXPECT_EQ
(
blocker
.
capacity
(),
20
);
}
TEST
(
Message
Test
,
publish
)
{
Message
Attr
attr
(
10
,
"channel"
);
Message
<
UnitTest
>
message
(
attr
);
TEST
(
Blocker
Test
,
publish
)
{
Blocker
Attr
attr
(
10
,
"channel"
);
Blocker
<
UnitTest
>
blocker
(
attr
);
auto
msg1
=
std
::
make_shared
<
UnitTest
>
();
msg1
->
set_class_name
(
"
Message
Test"
);
msg1
->
set_class_name
(
"
Blocker
Test"
);
msg1
->
set_case_name
(
"publish_1"
);
UnitTest
msg2
;
msg2
.
set_class_name
(
"
Message
Test"
);
msg2
.
set_class_name
(
"
Blocker
Test"
);
msg2
.
set_case_name
(
"publish_2"
);
EXPECT_TRUE
(
message
.
IsPublishedEmpty
());
message
.
Publish
(
msg1
);
message
.
Publish
(
msg2
);
EXPECT_FALSE
(
message
.
IsPublishedEmpty
());
EXPECT_TRUE
(
blocker
.
IsPublishedEmpty
());
blocker
.
Publish
(
msg1
);
blocker
.
Publish
(
msg2
);
EXPECT_FALSE
(
blocker
.
IsPublishedEmpty
());
EXPECT_TRUE
(
message
.
IsObservedEmpty
());
message
.
Observe
();
EXPECT_FALSE
(
message
.
IsObservedEmpty
());
EXPECT_TRUE
(
blocker
.
IsObservedEmpty
());
blocker
.
Observe
();
EXPECT_FALSE
(
blocker
.
IsObservedEmpty
());
auto
&
latest_observed_msg
=
message
.
GetLatestObserved
();
EXPECT_EQ
(
latest_observed_msg
.
class_name
(),
"
Message
Test"
);
auto
&
latest_observed_msg
=
blocker
.
GetLatestObserved
();
EXPECT_EQ
(
latest_observed_msg
.
class_name
(),
"
Blocker
Test"
);
EXPECT_EQ
(
latest_observed_msg
.
case_name
(),
"publish_2"
);
auto
latest_observed_msg_ptr
=
message
.
GetLatestObservedPtr
();
EXPECT_EQ
(
latest_observed_msg_ptr
->
class_name
(),
"
Message
Test"
);
auto
latest_observed_msg_ptr
=
blocker
.
GetLatestObservedPtr
();
EXPECT_EQ
(
latest_observed_msg_ptr
->
class_name
(),
"
Blocker
Test"
);
EXPECT_EQ
(
latest_observed_msg_ptr
->
case_name
(),
"publish_2"
);
auto
latest_published_ptr
=
message
.
GetLatestPublishedPtr
();
EXPECT_EQ
(
latest_published_ptr
->
class_name
(),
"
Message
Test"
);
auto
latest_published_ptr
=
blocker
.
GetLatestPublishedPtr
();
EXPECT_EQ
(
latest_published_ptr
->
class_name
(),
"
Blocker
Test"
);
EXPECT_EQ
(
latest_published_ptr
->
case_name
(),
"publish_2"
);
message
.
ClearPublished
();
EXPECT_TRUE
(
message
.
IsPublishedEmpty
());
EXPECT_FALSE
(
message
.
IsObservedEmpty
());
blocker
.
ClearPublished
();
EXPECT_TRUE
(
blocker
.
IsPublishedEmpty
());
EXPECT_FALSE
(
blocker
.
IsObservedEmpty
());
}
TEST
(
Message
Test
,
subscribe
)
{
Message
Attr
attr
(
10
,
"channel"
);
Message
<
UnitTest
>
message
(
attr
);
TEST
(
Blocker
Test
,
subscribe
)
{
Blocker
Attr
attr
(
10
,
"channel"
);
Blocker
<
UnitTest
>
blocker
(
attr
);
auto
received_msg
=
std
::
make_shared
<
UnitTest
>
();
bool
res
=
message
.
Subscribe
(
"
Message
Test1"
,
[
&
received_msg
](
const
std
::
shared_ptr
<
UnitTest
>&
msg
)
{
bool
res
=
blocker
.
Subscribe
(
"
Blocker
Test1"
,
[
&
received_msg
](
const
std
::
shared_ptr
<
UnitTest
>&
msg
)
{
received_msg
->
CopyFrom
(
*
msg
);
});
EXPECT_TRUE
(
res
);
auto
msg1
=
std
::
make_shared
<
UnitTest
>
();
msg1
->
set_class_name
(
"
Message
Test"
);
msg1
->
set_class_name
(
"
Blocker
Test"
);
msg1
->
set_case_name
(
"publish_1"
);
message
.
Publish
(
msg1
);
blocker
.
Publish
(
msg1
);
EXPECT_EQ
(
received_msg
->
class_name
(),
msg1
->
class_name
());
EXPECT_EQ
(
received_msg
->
case_name
(),
msg1
->
case_name
());
res
=
message
.
Subscribe
(
"
Message
Test1"
,
[
&
received_msg
](
const
std
::
shared_ptr
<
UnitTest
>&
msg
)
{
res
=
blocker
.
Subscribe
(
"
Blocker
Test1"
,
[
&
received_msg
](
const
std
::
shared_ptr
<
UnitTest
>&
msg
)
{
received_msg
->
CopyFrom
(
*
msg
);
});
EXPECT_FALSE
(
res
);
res
=
message
.
Unsubscribe
(
"Message
Test1"
);
res
=
blocker
.
Unsubscribe
(
"Blocker
Test1"
);
EXPECT_TRUE
(
res
);
res
=
message
.
Unsubscribe
(
"Message
Test1"
);
res
=
blocker
.
Unsubscribe
(
"Blocker
Test1"
);
EXPECT_FALSE
(
res
);
UnitTest
msg2
;
msg2
.
set_class_name
(
"
Message
Test"
);
msg2
.
set_class_name
(
"
Blocker
Test"
);
msg2
.
set_case_name
(
"publish_2"
);
message
.
Publish
(
msg2
);
blocker
.
Publish
(
msg2
);
EXPECT_NE
(
received_msg
->
case_name
(),
msg2
.
case_name
());
}
}
// namespace
dispatch
er
}
// namespace
block
er
}
// namespace cybertron
}
// namespace apollo
...
...
framework/cybertron/test/dispatcher/CMakeLists.txt
已删除
100644 → 0
浏览文件 @
6046b544
project
(
dispatcher_test
)
add_executable
(
dispatcher_dispatcher_test
dispatcher_test.cpp
)
target_link_libraries
(
dispatcher_dispatcher_test
cybertron
cybertron_dispatcher
gtest
)
add_executable
(
dispatcher_message_test
message_test.cpp
)
target_link_libraries
(
dispatcher_message_test
cybertron
cybertron_dispatcher
gtest
)
install
(
TARGETS
dispatcher_dispatcher_test
dispatcher_message_test
DESTINATION
${
UNIT_TEST_INSTALL_PREFIX
}
)
\ No newline at end of file
framework/examples/CMakeLists.txt
浏览文件 @
dd53d485
...
...
@@ -82,11 +82,11 @@ add_executable(user_defined_task
)
target_link_libraries
(
user_defined_task -Wl,--no-as-needed -pthread cybertron
)
add_executable
(
dispatch
er_example
dispatch
er_example.cpp
add_executable
(
block
er_example
block
er_example.cpp
)
target_link_libraries
(
dispatch
er_example -pthread dl cybertron perception_component
)
install
(
TARGETS
dispatch
er_example DESTINATION bin
)
target_link_libraries
(
block
er_example -pthread dl cybertron perception_component
)
install
(
TARGETS
block
er_example DESTINATION bin
)
install
(
DIRECTORY dag DESTINATION
${
CMAKE_INSTALL_PREFIX
}
)
...
...
framework/examples/
dispatch
er_example.cpp
→
framework/examples/
block
er_example.cpp
浏览文件 @
dd53d485
...
...
@@ -16,14 +16,24 @@
#include <iostream>
#include "cybertron/dispatcher/dispatcher.h"
#include "cybertron/blocker/blocker_manager.h"
#include "cybertron/common/global_data.h"
#include "cybertron/proto/component_config.pb.h"
#include "examples/component_perception/perception_component.h"
// To use this example, we need set run_mode to MODE_SIMULATION
// (run_mode is in file conf/cybertron.pb.conf)
int
main
(
int
argc
,
char
*
argv
[])
{
bool
is_reality_mode
=
apollo
::
cybertron
::
common
::
GlobalData
::
Instance
()
->
IsRealityMode
();
if
(
is_reality_mode
)
{
std
::
cout
<<
"To use this example:
\n
"
"we need to set run_mode to MODE_SIMULATION (run_mode is in
\n
"
"file conf/cybertron.pb.conf)
\n
"
"Or export CYBER_RUN_MODE=simulation firstly."
<<
std
::
endl
;
return
0
;
}
apollo
::
cybertron
::
proto
::
ComponentConfig
config
;
config
.
set_name
(
"perception"
);
auto
reader
=
config
.
add_readers
();
...
...
@@ -43,10 +53,11 @@ int main(int argc, char* argv[]) {
perception
->
Proc
(
driver_raw_msg
);
auto
message
=
apollo
::
cybertron
::
dispatcher
::
Dispatcher
::
Instance
()
->
GetMessage
<
Perception
>
(
"/perception/channel"
);
auto
blocker
=
apollo
::
cybertron
::
blocker
::
BlockerManager
::
Instance
()
->
GetBlocker
<
apollo
::
cybertron
::
proto
::
Perception
>
(
"/perception/channel"
);
bool
is_empty
=
message
->
IsPublishedEmpty
();
bool
is_empty
=
blocker
->
IsPublishedEmpty
();
if
(
is_empty
)
{
std
::
cout
<<
"simulation failed."
<<
std
::
endl
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录