Skip to content

Commit

Permalink
RtpsRelay cleanup and simplification
Browse files Browse the repository at this point in the history
Make use of C++11 features
  • Loading branch information
mitza-oci committed Sep 19, 2024
1 parent 6af9f91 commit dff29b5
Show file tree
Hide file tree
Showing 18 changed files with 303 additions and 284 deletions.
7 changes: 3 additions & 4 deletions tools/dds/rtpsrelaylib/Name.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void Name::parse(Name& name, const std::string& buffer, size_t& idx)

char Name::parse_character(Name& name, const std::string& buffer, size_t& idx)
{
char c = buffer[idx++];
const auto c = buffer[idx++];
if (c == '\\') {
if (idx == buffer.size()) {
name.is_valid_ = false;
Expand Down Expand Up @@ -123,8 +123,7 @@ void Name::parse_character_class_tail(Name& name, const std::string& buffer, siz
return;
}

char c = buffer[idx];
if (c == ']') {
if (buffer[idx] == ']') {
++idx;
return;
}
Expand Down Expand Up @@ -154,7 +153,7 @@ void Name::parse_character_or_range(Name& name, const std::string& buffer, size_
return;
}

char last = parse_character(name, buffer, idx);
const auto last = parse_character(name, buffer, idx);
if (first > last) {
name.is_valid_ = false;
return;
Expand Down
16 changes: 9 additions & 7 deletions tools/dds/rtpsrelaylib/Name.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

#include "export.h"

#include <cstddef>
#include <iosfwd>
#include <set>
#include <string>
#include <vector>
Expand Down Expand Up @@ -73,7 +75,7 @@ class OpenDDS_RtpsRelayLib_Export Atom {
};

struct AtomHash {
std::size_t operator() (const Atom& atom) const
std::size_t operator()(const Atom& atom) const
{
std::size_t result = atom.kind();
result ^= (atom.character() << 8);
Expand All @@ -88,12 +90,12 @@ OpenDDS_RtpsRelayLib_Export std::ostream& operator<<(std::ostream& out, const At

class OpenDDS_RtpsRelayLib_Export Name {
public:
typedef std::vector<Atom> Atoms;
typedef Atoms::const_iterator const_iterator;
using Atoms = std::vector<Atom>;
using const_iterator = Atoms::const_iterator;

Name() : is_pattern_(false), is_valid_(true) {}
Name() = default;

explicit Name(const std::string& name) : is_pattern_(false), is_valid_(true)
explicit Name(const std::string& name)
{
size_t idx = 0;
parse(*this, name, idx);
Expand Down Expand Up @@ -129,8 +131,8 @@ class OpenDDS_RtpsRelayLib_Export Name {

private:
Atoms atoms_;
bool is_pattern_;
bool is_valid_;
bool is_pattern_ = false;
bool is_valid_ = true;

static void parse(Name& name, const std::string& buffer, size_t& idx);
static char parse_character(Name& name, const std::string& buffer, size_t& idx);
Expand Down
30 changes: 15 additions & 15 deletions tools/dds/rtpsrelaylib/PartitionIndex.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@ struct Identity {
template<typename T, typename Transformer>
class TrieNode {
public:
typedef std::shared_ptr<TrieNode> NodePtr;
using NodePtr = std::shared_ptr<TrieNode>;
using Value = typename T::value_type;

static void insert(NodePtr node, const Name& name, const typename T::value_type& guid)
static void insert(NodePtr node, const Name& name, const Value& guid)
{
for (const auto& atom : name) {
const auto iter = node->children_.find(atom);
if (iter == node->children_.end()) {
NodePtr child(new TrieNode());
NodePtr child = std::make_shared<TrieNode>();
node->children_[atom] = child;
node = std::move(child);
} else {
Expand All @@ -44,7 +45,7 @@ class TrieNode {
node->guids_.insert(guid);
}

static void remove(NodePtr node, const Name& name, const typename T::value_type& guid)
static void remove(NodePtr node, const Name& name, const Value& guid)
{
remove(std::move(node), name.begin(), name.end(), guid);
}
Expand All @@ -64,12 +65,11 @@ class TrieNode {
}

private:
typedef std::unordered_map<Atom, NodePtr, AtomHash> ChildrenType;
using ChildrenType = std::unordered_map<Atom, NodePtr, AtomHash>;
ChildrenType children_;
T guids_;

static void insert_guids(NodePtr node,
T& guids)
static void insert_guids(NodePtr node, T& guids)
{
std::transform(node->guids_.begin(), node->guids_.end(), std::inserter(guids, guids.begin()), Transformer());
}
Expand Down Expand Up @@ -120,8 +120,7 @@ class TrieNode {
}
}

static void lookup_globs(NodePtr node,
T& guids)
static void lookup_globs(NodePtr node, T& guids)
{
for (const auto& pos : node->children_) {
if (pos.first.kind() == Atom::GLOB) {
Expand Down Expand Up @@ -189,7 +188,7 @@ class TrieNode {
static void remove(NodePtr node,
Name::const_iterator begin,
Name::const_iterator end,
const typename T::value_type& guid)
const Value& guid)
{
if (begin == end) {
node->guids_.erase(guid);
Expand All @@ -210,19 +209,20 @@ class TrieNode {
template <typename T, typename Transformer>
class PartitionIndex {
public:
typedef TrieNode<T, Transformer> TrieNodeT;
using TrieNodeT = TrieNode<T, Transformer>;
using Value = typename T::value_type;

PartitionIndex()
: root_(new TrieNodeT())
: root_(std::make_shared<TrieNodeT>())
{}

void insert(const std::string& name, const typename T::value_type& guid)
void insert(const std::string& name, const Value& guid)
{
TrieNodeT::insert(root_, Name(name), guid);
cache_.clear();
}

void remove(const std::string& name, const typename T::value_type& guid)
void remove(const std::string& name, const Value& guid)
{
TrieNodeT::remove(root_, Name(name), guid);
cache_.clear();
Expand Down Expand Up @@ -269,7 +269,7 @@ class PartitionIndex {

private:
typename TrieNodeT::NodePtr root_;
typedef std::unordered_map<std::string, T> Cache;
using Cache = std::unordered_map<std::string, T>;
mutable Cache cache_;
};

Expand Down
2 changes: 1 addition & 1 deletion tools/dds/rtpsrelaylib/Utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

namespace RtpsRelay {

typedef std::set<std::string> StringSet;
using StringSet = std::set<std::string>;

inline std::string guid_to_string(const OpenDDS::DCPS::GUID_t& a_guid)
{
Expand Down
97 changes: 97 additions & 0 deletions tools/rtpsrelay/GuidAddrSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,103 @@

namespace RtpsRelay {

bool AddrSetStats::upsert_address(const AddrPort& remote_address,
const OpenDDS::DCPS::MonotonicTimePoint& now,
const OpenDDS::DCPS::MonotonicTimePoint& expiration,
size_t max_ip_addresses)
{
ACE_INET_Addr addr_only(remote_address.addr);
addr_only.set_port_number(0);
auto iter = ip_to_ports.find(addr_only);
if (iter == ip_to_ports.end()) {
if (max_ip_addresses > 0 && ip_to_ports.size() == max_ip_addresses) {
return false;
}
iter = ip_to_ports.insert(std::make_pair(addr_only, PortSet())).first;
}

relay_stats_reporter_.max_ips_per_client(static_cast<uint32_t>(ip_to_ports.size()), now);

std::map<u_short, OpenDDS::DCPS::MonotonicTimePoint>* port_map = nullptr;
switch (remote_address.port) {
case SPDP:
port_map = &iter->second.spdp_ports;
break;
case SEDP:
port_map = &iter->second.sedp_ports;
break;
case DATA:
port_map = &iter->second.data_ports;
break;
}
if (!port_map) {
return false;
}
const auto pair = port_map->insert(std::make_pair(remote_address.addr.get_port_number(), expiration));
if (pair.second) {
return true;
}
pair.first->second = expiration;
return false;
}

bool AddrSetStats::remove_if_expired(const AddrPort& remote_address, const OpenDDS::DCPS::MonotonicTimePoint& now,
bool& ip_now_unused, OpenDDS::DCPS::MonotonicTimePoint& updated_expiration)
{
ACE_INET_Addr addr_only(remote_address.addr);
addr_only.set_port_number(0);
const auto iter = ip_to_ports.find(addr_only);
if (iter == ip_to_ports.end()) {
return false;
}

std::map<u_short, OpenDDS::DCPS::MonotonicTimePoint>* port_map = nullptr;
switch (remote_address.port) {
case SPDP:
port_map = &iter->second.spdp_ports;
break;
case SEDP:
port_map = &iter->second.sedp_ports;
break;
case DATA:
port_map = &iter->second.data_ports;
break;
}

if (!port_map) {
return false;
}

const auto port_iter = port_map->find(remote_address.addr.get_port_number());
if (port_iter == port_map->end()) {
return false;
}

if (port_iter->second <= now) {
port_map->erase(port_iter);
if (iter->second.empty()) {
ip_to_ports.erase(addr_only);
ip_now_unused = true;
}
return true;
}
updated_expiration = port_iter->second;
return false;
}

GuidAddrSet::CreatedAddrSetStats GuidAddrSet::find_or_create(const OpenDDS::DCPS::GUID_t& guid,
const OpenDDS::DCPS::MonotonicTimePoint& now)
{
auto it = guid_addr_set_map_.find(guid);
const bool create = it == guid_addr_set_map_.end();
if (create) {
const auto it_bool_pair =
guid_addr_set_map_.insert(std::make_pair(guid, AddrSetStats(guid, now, relay_stats_reporter_)));
it = it_bool_pair.first;
}
return {create, it->second};
}

ParticipantStatisticsReporter&
GuidAddrSet::record_activity(const AddrPort& remote_address,
const OpenDDS::DCPS::MonotonicTimePoint& now,
Expand Down
Loading

0 comments on commit dff29b5

Please sign in to comment.