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 <condition_variable>
20 #include <mutex>
21 #include <set>
22 
23 #include "fastdds/dds/core/status/BaseStatus.hpp"
24 #include "fastdds/dds/core/status/DeadlineMissedStatus.hpp"
25 #include "fastdds/dds/core/status/PublicationMatchedStatus.hpp"
26 #include "fastdds/dds/publisher/DataWriter.hpp"
27 #include "fastdds/dds/publisher/DataWriterListener.hpp"
28 #include "fastdds/dds/topic/Topic.hpp"
29 #include "fastdds/dds/topic/TypeSupport.hpp"
30 
31 #include "fastdds/rtps/common/Guid.h"
32 #include "fastdds/rtps/common/InstanceHandle.h"
33 
35 #include "rmw/rmw.h"
36 
38 
39 
40 class PubListener;
41 
42 typedef struct CustomPublisherInfo : public CustomEventInfo
43 {
44  virtual ~CustomPublisherInfo() = default;
45 
46  eprosima::fastdds::dds::DataWriter * data_writer_{nullptr};
47  PubListener * listener_{nullptr};
48  eprosima::fastdds::dds::TypeSupport type_support_;
49  const void * type_support_impl_{nullptr};
51  const char * typesupport_identifier_{nullptr};
52 
55  getListener() const final;
57 
58 class PubListener : public EventListenerInterface, public eprosima::fastdds::dds::DataWriterListener
59 {
60 public:
62  : deadline_changes_(false),
63  liveliness_changes_(false),
64  conditionMutex_(nullptr),
65  conditionVariable_(nullptr)
66  {
67  (void) info;
68  }
69 
70  // DataWriterListener implementation
72  void
74  eprosima::fastdds::dds::DataWriter * /* writer */,
75  const eprosima::fastdds::dds::PublicationMatchedStatus & info) final
76  {
77  std::lock_guard<std::mutex> lock(internalMutex_);
78  if (info.current_count_change == 1) {
79  subscriptions_.insert(eprosima::fastrtps::rtps::iHandle2GUID(info.last_subscription_handle));
80  } else if (info.current_count_change == -1) {
81  subscriptions_.erase(eprosima::fastrtps::rtps::iHandle2GUID(info.last_subscription_handle));
82  }
83  }
84 
86  void
87  on_offered_deadline_missed(
88  eprosima::fastdds::dds::DataWriter * writer,
89  const eprosima::fastdds::dds::OfferedDeadlineMissedStatus & status) final;
90 
92  void
93  on_liveliness_lost(
94  eprosima::fastdds::dds::DataWriter * writer,
95  const eprosima::fastdds::dds::LivelinessLostStatus & status) final;
96 
97 
98  // EventListenerInterface implementation
100  bool
101  hasEvent(rmw_event_type_t event_type) const final;
102 
104  bool
105  takeNextEvent(rmw_event_type_t event_type, void * event_info) final;
106 
107  // PubListener API
109  {
110  std::lock_guard<std::mutex> lock(internalMutex_);
111  return subscriptions_.size();
112  }
113 
114  void
115  attachCondition(std::mutex * conditionMutex, std::condition_variable * conditionVariable)
116  {
117  std::lock_guard<std::mutex> lock(internalMutex_);
118  conditionMutex_ = conditionMutex;
119  conditionVariable_ = conditionVariable;
120  }
121 
122  void
124  {
125  std::lock_guard<std::mutex> lock(internalMutex_);
126  conditionMutex_ = nullptr;
127  conditionVariable_ = nullptr;
128  }
129 
130 private:
131  mutable std::mutex internalMutex_;
132 
134  RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
135 
136  std::atomic_bool deadline_changes_;
137  eprosima::fastdds::dds::OfferedDeadlineMissedStatus offered_deadline_missed_status_
138  RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
139 
140  std::atomic_bool liveliness_changes_;
141  eprosima::fastdds::dds::LivelinessLostStatus liveliness_lost_status_
142  RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
143 
144  std::mutex * conditionMutex_ RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
145  std::condition_variable * conditionVariable_ RCPPUTILS_TSA_GUARDED_BY(internalMutex_);
146 };
147 
148 #endif // RMW_FASTRTPS_SHARED_CPP__CUSTOM_PUBLISHER_INFO_HPP_
CustomPublisherInfo::type_support_impl_
const void * type_support_impl_
Definition: custom_publisher_info.hpp:49
rmw.h
rmw_event_type_t
rmw_event_type_t
RCPPUTILS_TSA_GUARDED_BY
#define RCPPUTILS_TSA_GUARDED_BY(x)
std::lock_guard
RMW_FASTRTPS_SHARED_CPP_PUBLIC
#define RMW_FASTRTPS_SHARED_CPP_PUBLIC
Definition: visibility_control.h:50
CustomPublisherInfo::~CustomPublisherInfo
virtual ~CustomPublisherInfo()=default
CustomPublisherInfo
Definition: custom_publisher_info.hpp:42
CustomPublisherInfo::getListener
EventListenerInterface * getListener() const final
CustomPublisherInfo::listener_
PubListener * listener_
Definition: custom_publisher_info.hpp:47
PubListener
Definition: custom_publisher_info.hpp:58
CustomPublisherInfo::data_writer_
eprosima::fastdds::dds::DataWriter * data_writer_
Definition: custom_publisher_info.hpp:46
PubListener::detachCondition
void detachCondition()
Unset the information from attachCondition.
Definition: custom_publisher_info.hpp:123
PubListener::on_publication_matched
void on_publication_matched(eprosima::fastdds::dds::DataWriter *, const eprosima::fastdds::dds::PublicationMatchedStatus &info) final
Definition: custom_publisher_info.hpp:73
CustomPublisherInfo::typesupport_identifier_
const char * typesupport_identifier_
Definition: custom_publisher_info.hpp:51
PubListener::subscriptionCount
size_t subscriptionCount()
Definition: custom_publisher_info.hpp:108
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:115
CustomPublisherInfo::publisher_gid
rmw_gid_t publisher_gid
Definition: custom_publisher_info.hpp:50
thread_safety_annotations.hpp
std::condition_variable
custom_event_info.hpp
PubListener::PubListener
PubListener(CustomPublisherInfo *info)
Definition: custom_publisher_info.hpp:61
std::mutex
std::set< eprosima::fastrtps::rtps::GUID_t >
CustomEventInfo
Definition: custom_event_info.hpp:91
EventListenerInterface
Definition: custom_event_info.hpp:32
CustomPublisherInfo::type_support_
eprosima::fastdds::dds::TypeSupport type_support_
Definition: custom_publisher_info.hpp:48