rmw_fastrtps_shared_cpp  master
Code shared on static and dynamic type support of rmw_fastrtps_cpp.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
custom_publisher_info.hpp
Go to the documentation of this file.
1 // Copyright 2016-2018 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef RMW_FASTRTPS_SHARED_CPP__CUSTOM_PUBLISHER_INFO_HPP_
16 #define RMW_FASTRTPS_SHARED_CPP__CUSTOM_PUBLISHER_INFO_HPP_
17 
18 #include <atomic>
19 #include <mutex>
20 #include <condition_variable>
21 #include <set>
22 
23 #include "fastrtps/publisher/Publisher.h"
24 #include "fastrtps/publisher/PublisherListener.h"
25 
27 #include "rmw/rmw.h"
28 
31 
32 
33 class PubListener;
34 
35 typedef struct CustomPublisherInfo : public CustomEventInfo
36 {
37  virtual ~CustomPublisherInfo() = default;
38 
39  eprosima::fastrtps::Publisher * publisher_;
42  const void * type_support_impl_;
45 
48  getListener() const final;
50 
51 class PubListener : public EventListenerInterface, public eprosima::fastrtps::PublisherListener
52 {
53 public:
55  : deadline_changes_(false),
56  liveliness_changes_(false),
57  conditionMutex_(nullptr),
58  conditionVariable_(nullptr)
59  {
60  (void) info;
61  }
62 
63  // PublisherListener implementation
65  void
67  eprosima::fastrtps::Publisher * pub, eprosima::fastrtps::rtps::MatchingInfo & info) final
68  {
69  (void) pub;
70  std::lock_guard<std::mutex> lock(internalMutex_);
71  if (eprosima::fastrtps::rtps::MATCHED_MATCHING == info.status) {
72  subscriptions_.insert(info.remoteEndpointGuid);
73  } else if (eprosima::fastrtps::rtps::REMOVED_MATCHING == info.status) {
74  subscriptions_.erase(info.remoteEndpointGuid);
75  }
76  }
77 
79  void
80  on_offered_deadline_missed(
81  eprosima::fastrtps::Publisher * publisher,
82  const eprosima::fastrtps::OfferedDeadlineMissedStatus & status) final;
83 
85  void
86  on_liveliness_lost(
87  eprosima::fastrtps::Publisher * publisher,
88  const eprosima::fastrtps::LivelinessLostStatus & status) final;
89 
90 
91  // EventListenerInterface implementation
93  bool
94  hasEvent(rmw_event_type_t event_type) const final;
95 
97  bool
98  takeNextEvent(rmw_event_type_t event_type, void * event_info) final;
99 
100  // PubListener API
102  {
103  std::lock_guard<std::mutex> lock(internalMutex_);
104  return subscriptions_.size();
105  }
106 
107  void
108  attachCondition(std::mutex * conditionMutex, std::condition_variable * conditionVariable)
109  {
110  std::lock_guard<std::mutex> lock(internalMutex_);
111  conditionMutex_ = conditionMutex;
112  conditionVariable_ = conditionVariable;
113  }
114 
115  void
117  {
118  std::lock_guard<std::mutex> lock(internalMutex_);
119  conditionMutex_ = nullptr;
120  conditionVariable_ = nullptr;
121  }
122 
123 private:
124  mutable std::mutex internalMutex_;
125 
127  RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
128 
129  std::atomic_bool deadline_changes_;
130  eprosima::fastrtps::OfferedDeadlineMissedStatus offered_deadline_missed_status_
131  RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
132 
133  std::atomic_bool liveliness_changes_;
134  eprosima::fastrtps::LivelinessLostStatus liveliness_lost_status_
135  RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
136 
137  std::mutex * conditionMutex_ RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
138  std::condition_variable * conditionVariable_ RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
139 };
140 
141 #endif // RMW_FASTRTPS_SHARED_CPP__CUSTOM_PUBLISHER_INFO_HPP_
CustomPublisherInfo::type_support_impl_
const void * type_support_impl_
Definition: custom_publisher_info.hpp:42
rmw.h
rmw_event_type_t
rmw_event_type_t
CustomPublisherInfo::type_support_
rmw_fastrtps_shared_cpp::TypeSupport * type_support_
Definition: custom_publisher_info.hpp:41
RCPPUTILS_TSA_GUARDED_BY
#define RCPPUTILS_TSA_GUARDED_BY(x)
rmw_fastrtps_shared_cpp::TypeSupport
Definition: TypeSupport.hpp:41
std::lock_guard
RMW_FASTRTPS_SHARED_CPP_PUBLIC
#define RMW_FASTRTPS_SHARED_CPP_PUBLIC
Definition: visibility_control.h:50
TypeSupport.hpp
CustomPublisherInfo::~CustomPublisherInfo
virtual ~CustomPublisherInfo()=default
CustomPublisherInfo
Definition: custom_publisher_info.hpp:35
CustomPublisherInfo::getListener
EventListenerInterface * getListener() const final
CustomPublisherInfo::listener_
PubListener * listener_
Definition: custom_publisher_info.hpp:40
PubListener
Definition: custom_publisher_info.hpp:51
PubListener::detachCondition
void detachCondition()
Unset the information from attachCondition.
Definition: custom_publisher_info.hpp:116
CustomPublisherInfo::typesupport_identifier_
const char * typesupport_identifier_
Definition: custom_publisher_info.hpp:44
CustomPublisherInfo::publisher_
eprosima::fastrtps::Publisher * publisher_
Definition: custom_publisher_info.hpp:39
PubListener::subscriptionCount
size_t subscriptionCount()
Definition: custom_publisher_info.hpp:101
rmw_gid_t
PubListener::attachCondition
void attachCondition(std::mutex *conditionMutex, std::condition_variable *conditionVariable)
Connect a condition variable so a waiter can be notified of new data.
Definition: custom_publisher_info.hpp:108
CustomPublisherInfo::publisher_gid
rmw_gid_t publisher_gid
Definition: custom_publisher_info.hpp:43
thread_safety_annotations.hpp
std::condition_variable
custom_event_info.hpp
PubListener::PubListener
PubListener(CustomPublisherInfo *info)
Definition: custom_publisher_info.hpp:54
std::mutex
PubListener::onPublicationMatched
void onPublicationMatched(eprosima::fastrtps::Publisher *pub, eprosima::fastrtps::rtps::MatchingInfo &info) final
Definition: custom_publisher_info.hpp:66
eprosima
Definition: qos.hpp:29
std::set< eprosima::fastrtps::rtps::GUID_t >
CustomEventInfo
Definition: custom_event_info.hpp:98
EventListenerInterface
Definition: custom_event_info.hpp:39