Program Listing for File PDP.h
↰ Return to documentation for file (/tmp/ws/src/fastrtps/include/fastdds/rtps/builtin/discovery/participant/PDP.h
)
// Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _FASTDDS_RTPS_PDP_H_
#define _FASTDDS_RTPS_PDP_H_
#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
#include <atomic>
#include <mutex>
#include <functional>
#include <fastdds/rtps/attributes/RTPSParticipantAttributes.h>
#include <fastdds/rtps/builtin/data/ReaderProxyData.h>
#include <fastdds/rtps/builtin/data/WriterProxyData.h>
#include <fastdds/rtps/common/Guid.h>
#include <fastdds/rtps/participant/ParticipantDiscoveryInfo.h>
#include <fastrtps/qos/QosPolicies.h>
#include <fastrtps/utils/ProxyPool.hpp>
#include <fastrtps/utils/collections/ResourceLimitedVector.hpp>
namespace eprosima {
namespace fastdds {
namespace rtps {
class PDPServerListener;
} // namespace rtps
} // namespace fastdds
namespace fastrtps {
namespace rtps {
class RTPSWriter;
class RTPSReader;
class WriterHistory;
class ReaderHistory;
class RTPSParticipantImpl;
class RTPSParticipantListener;
class BuiltinProtocols;
class EDP;
class TimedEvent;
class ReaderProxyData;
class WriterProxyData;
class ParticipantProxyData;
class ReaderListener;
class PDPListener;
class PDPServerListener;
class ITopicPayloadPool;
class PDP
{
friend class PDPListener;
friend class PDPServerListener;
friend class fastdds::rtps::PDPServerListener;
public:
PDP(
BuiltinProtocols* builtin,
const RTPSParticipantAllocationAttributes& allocation);
virtual ~PDP();
virtual void initializeParticipantProxyData(
ParticipantProxyData* participant_data);
bool initPDP(
RTPSParticipantImpl* part);
bool enable();
virtual bool init(
RTPSParticipantImpl* part) = 0;
virtual ParticipantProxyData* createParticipantProxyData(
const ParticipantProxyData& p,
const GUID_t& writer_guid) = 0;
virtual void announceParticipantState(
bool new_change,
bool dispose = false,
WriteParams& wparams = WriteParams::WRITE_PARAM_DEFAULT);
virtual void stopParticipantAnnouncement();
virtual void resetParticipantAnnouncement();
ReaderProxyData* addReaderProxyData(
const GUID_t& reader_guid,
GUID_t& participant_guid,
std::function<bool(ReaderProxyData*, bool, const ParticipantProxyData&)> initializer_func);
WriterProxyData* addWriterProxyData(
const GUID_t& writer_guid,
GUID_t& participant_guid,
std::function<bool(WriterProxyData*, bool, const ParticipantProxyData&)> initializer_func);
bool has_reader_proxy_data(
const GUID_t& reader);
bool lookupReaderProxyData(
const GUID_t& reader,
ReaderProxyData& rdata);
bool has_writer_proxy_data(
const GUID_t& writer);
bool lookupWriterProxyData(
const GUID_t& writer,
WriterProxyData& wdata);
bool lookup_participant_name(
const GUID_t& guid,
string_255& name);
bool removeReaderProxyData(
const GUID_t& reader_guid);
bool removeWriterProxyData(
const GUID_t& writer_guid);
virtual bool createPDPEndpoints() = 0;
virtual void assignRemoteEndpoints(
ParticipantProxyData* pdata) = 0;
virtual void notifyAboveRemoteEndpoints(
const ParticipantProxyData& pdata) = 0;
virtual bool updateInfoMatchesEDP()
{
return false;
}
virtual void removeRemoteEndpoints(
ParticipantProxyData* pdata) = 0;
virtual bool remove_remote_participant(
const GUID_t& participant_guid,
ParticipantDiscoveryInfo::DISCOVERY_STATUS reason);
const BuiltinAttributes& builtin_attributes() const;
ParticipantProxyData* getLocalParticipantProxyData()
{
return participant_proxies_.front();
}
inline EDP* getEDP()
{
return mp_EDP;
}
ResourceLimitedVector<ParticipantProxyData*>::const_iterator ParticipantProxiesBegin()
{
return participant_proxies_.begin();
}
ResourceLimitedVector<ParticipantProxyData*>::const_iterator ParticipantProxiesEnd()
{
return participant_proxies_.end();
}
void assert_remote_participant_liveliness(
const GuidPrefix_t& remote_guid);
inline RTPSParticipantImpl* getRTPSParticipant() const
{
return mp_RTPSParticipant;
}
inline std::recursive_mutex* getMutex() const
{
return mp_mutex;
}
CDRMessage_t get_participant_proxy_data_serialized(
Endianness_t endian);
ParticipantProxyData* get_participant_proxy_data(
const GuidPrefix_t& guid_prefix);
std::list<eprosima::fastdds::rtps::RemoteServerAttributes>& remote_server_attributes();
ProxyPool<ReaderProxyData>& get_temporary_reader_proxies_pool()
{
return temp_reader_proxies_;
}
ProxyPool<WriterProxyData>& get_temporary_writer_proxies_pool()
{
return temp_writer_proxies_;
}
protected:
BuiltinProtocols* mp_builtin;
RTPSParticipantImpl* mp_RTPSParticipant;
BuiltinAttributes m_discovery;
RTPSWriter* mp_PDPWriter;
RTPSReader* mp_PDPReader;
EDP* mp_EDP;
size_t participant_proxies_number_;
ResourceLimitedVector<ParticipantProxyData*> participant_proxies_;
ResourceLimitedVector<ParticipantProxyData*> participant_proxies_pool_;
size_t reader_proxies_number_;
ResourceLimitedVector<ReaderProxyData*> reader_proxies_pool_;
size_t writer_proxies_number_;
ResourceLimitedVector<WriterProxyData*> writer_proxies_pool_;
std::atomic_bool m_hasChangedLocalPDP;
ReaderListener* mp_listener;
WriterHistory* mp_PDPWriterHistory;
std::shared_ptr<ITopicPayloadPool> writer_payload_pool_;
ReaderHistory* mp_PDPReaderHistory;
std::shared_ptr<ITopicPayloadPool> reader_payload_pool_;
ProxyPool<ReaderProxyData> temp_reader_proxies_;
ProxyPool<WriterProxyData> temp_writer_proxies_;
std::recursive_mutex* mp_mutex;
std::mutex callback_mtx_;
std::atomic<bool> enabled_ {false};
ParticipantProxyData* add_participant_proxy_data(
const GUID_t& participant_guid,
bool with_lease_duration,
const ParticipantProxyData* participant_proxy_data = nullptr);
bool lookup_participant_key(
const GUID_t& participant_guid,
InstanceHandle_t& key);
private:
TimedEvent* resend_participant_info_event_;
InitialAnnouncementConfig initial_announcements_;
void check_remote_participant_liveliness(
ParticipantProxyData* remote_participant);
void check_and_notify_type_discovery(
RTPSParticipantListener* listener,
const WriterProxyData& wdata) const;
void check_and_notify_type_discovery(
RTPSParticipantListener* listener,
const ReaderProxyData& rdata) const;
void check_and_notify_type_discovery(
RTPSParticipantListener* listener,
const string_255& topic_name,
const string_255& type_name,
const types::TypeIdentifier* type_id,
const types::TypeObject* type_obj,
const xtypes::TypeInformation* type_info) const;
void set_next_announcement_interval();
void set_initial_announcement_interval();
void set_external_participant_properties_(
ParticipantProxyData* participant_data);
};
// configuration values for PDP reliable entities.
extern const Duration_t pdp_heartbeat_period;
extern const Duration_t pdp_nack_response_delay;
extern const Duration_t pdp_nack_supression_duration;
extern const Duration_t pdp_heartbeat_response_delay;
extern const int32_t pdp_initial_reserved_caches;
} /* namespace rtps */
} /* namespace fastrtps */
} /* namespace eprosima */
#endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC
#endif /* _FASTDDS_RTPS_PDP_H_ */