Skip to content

Commit 18351f6

Browse files
committed
introduced ITransferIdMap and ITransferIdStorage interfaces
1 parent e48fa2a commit 18351f6

File tree

8 files changed

+381
-177
lines changed

8 files changed

+381
-177
lines changed

include/libcyphal/presentation/client_impl.hpp

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include "libcyphal/executor.hpp"
1414
#include "libcyphal/transport/errors.hpp"
1515
#include "libcyphal/transport/svc_sessions.hpp"
16-
#include "libcyphal/transport/transfer_id_generators.hpp"
16+
#include "libcyphal/transport/transfer_id_map.hpp"
1717
#include "libcyphal/transport/types.hpp"
1818
#include "libcyphal/types.hpp"
1919

@@ -34,7 +34,9 @@ namespace presentation
3434
namespace detail
3535
{
3636

37-
class SharedClient : public common::cavl::Node<SharedClient>, public SharedObject
37+
class SharedClient : public common::cavl::Node<SharedClient>,
38+
public SharedObject,
39+
public transport::detail::ITransferIdStorage
3840
{
3941
public:
4042
using Node::remove;
@@ -135,6 +137,7 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
135137
, svc_response_rx_session_{std::move(svc_response_rx_session)}
136138
, response_rx_params_{svc_response_rx_session_->getParams()}
137139
, nearest_deadline_{DistantFuture()}
140+
, transfer_id_{0}
138141
{
139142
CETL_DEBUG_ASSERT(svc_request_tx_session_ != nullptr, "");
140143
CETL_DEBUG_ASSERT(svc_response_rx_session_ != nullptr, "");
@@ -144,7 +147,7 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
144147
// Otherwise, the responses would be rejected (as "duplicates") if their transfer IDs are in order.
145148
// Real duplicates (f.e. caused by redundant transports) won't cause any issues
146149
// b/c shared RPC client expects/accepts only one response per transfer ID,
147-
// and corresponding promise callback node will be removed after the first response.
150+
// and the corresponding promise callback node will be removed after the first response.
148151
svc_response_rx_session_->setTransferIdTimeout({});
149152

150153
svc_response_rx_session_->setOnReceiveCallback([this](const auto& arg) {
@@ -243,6 +246,18 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
243246
delegate_.forgetSharedClient(*this);
244247
}
245248

249+
// MARK: ITransferIdStorage
250+
251+
transport::TransferId load() const noexcept override
252+
{
253+
return transfer_id_;
254+
}
255+
256+
void save(const transport::TransferId transfer_id) noexcept override
257+
{
258+
transfer_id_ = transfer_id;
259+
}
260+
246261
protected:
247262
virtual void insertNewCallbackNode(CallbackNode& callback_node)
248263
{
@@ -392,15 +407,16 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
392407
TimePoint nearest_deadline_;
393408
common::cavl::Tree<TimeoutNode> timeout_nodes_by_deadline_;
394409
IExecutor::Callback::Any nearest_deadline_callback_;
410+
transport::TransferId transfer_id_;
395411

396412
}; // SharedClient
397413

398414
// MARK: -
399415

400416
/// @brief Defines a shared client implementation that uses a generic transfer ID generator.
401417
///
402-
template <typename TransferIdGeneratorMixin>
403-
class ClientImpl final : public SharedClient, private TransferIdGeneratorMixin
418+
template <typename TransferIdGenerator>
419+
class ClientImpl final : public SharedClient
404420
{
405421
public:
406422
ClientImpl(IPresentationDelegate& delegate,
@@ -409,7 +425,7 @@ class ClientImpl final : public SharedClient, private TransferIdGeneratorMixin
409425
UniquePtr<transport::IResponseRxSession> svc_response_rx_session,
410426
const transport::TransferId transfer_id_modulo)
411427
: SharedClient{delegate, executor, std::move(svc_request_tx_session), std::move(svc_response_rx_session)}
412-
, TransferIdGeneratorMixin{transfer_id_modulo}
428+
, transfer_id_generator_{transfer_id_modulo, *this}
413429
{
414430
}
415431

@@ -424,40 +440,41 @@ class ClientImpl final : public SharedClient, private TransferIdGeneratorMixin
424440
private:
425441
using Base = SharedClient;
426442

427-
// MARK: SharedClient
428-
429-
CETL_NODISCARD cetl::optional<transport::TransferId> nextTransferId() noexcept override
430-
{
431-
return TransferIdGeneratorMixin::nextTransferId();
432-
}
433-
434443
void insertNewCallbackNode(CallbackNode& callback_node) override
435444
{
436445
SharedClient::insertNewCallbackNode(callback_node);
437-
TransferIdGeneratorMixin::retainTransferId(callback_node.getTransferId());
446+
transfer_id_generator_.retainTransferId(callback_node.getTransferId());
438447
}
439448

440449
void removeCallbackNode(CallbackNode& callback_node) override
441450
{
442-
TransferIdGeneratorMixin::releaseTransferId(callback_node.getTransferId());
451+
transfer_id_generator_.releaseTransferId(callback_node.getTransferId());
443452
SharedClient::removeCallbackNode(callback_node);
444453
}
445454

455+
// MARK: SharedClient
456+
457+
CETL_NODISCARD cetl::optional<transport::TransferId> nextTransferId() noexcept override
458+
{
459+
return transfer_id_generator_.nextTransferId();
460+
}
461+
462+
TransferIdGenerator transfer_id_generator_;
463+
446464
}; // ClientImpl<TransferIdGeneratorMixin>
447465

448466
/// @brief Defines a shared client specialization that uses a trivial transfer ID generator.
449467
///
450468
template <>
451-
class ClientImpl<transport::detail::TrivialTransferIdGenerator> final
452-
: public SharedClient,
453-
private transport::detail::TrivialTransferIdGenerator
469+
class ClientImpl<transport::detail::TrivialTransferIdGenerator> final : public SharedClient
454470
{
455471
public:
456472
ClientImpl(IPresentationDelegate& delegate,
457473
IExecutor& executor,
458474
UniquePtr<transport::IRequestTxSession> svc_request_tx_session,
459475
UniquePtr<transport::IResponseRxSession> svc_response_rx_session)
460476
: Base{delegate, executor, std::move(svc_request_tx_session), std::move(svc_response_rx_session)}
477+
, transfer_id_generator_{*this}
461478
{
462479
}
463480

@@ -476,9 +493,11 @@ class ClientImpl<transport::detail::TrivialTransferIdGenerator> final
476493

477494
CETL_NODISCARD cetl::optional<transport::TransferId> nextTransferId() noexcept override
478495
{
479-
return TrivialTransferIdGenerator::nextTransferId();
496+
return transfer_id_generator_.nextTransferId();
480497
}
481498

499+
transport::detail::TrivialTransferIdGenerator transfer_id_generator_;
500+
482501
}; // ClientImpl<TrivialTransferIdGenerator>
483502

484503
} // namespace detail

include/libcyphal/presentation/presentation.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include "libcyphal/transport/errors.hpp"
2424
#include "libcyphal/transport/msg_sessions.hpp"
2525
#include "libcyphal/transport/svc_sessions.hpp"
26-
#include "libcyphal/transport/transfer_id_generators.hpp"
26+
#include "libcyphal/transport/transfer_id_map.hpp"
2727
#include "libcyphal/transport/transport.hpp"
2828
#include "libcyphal/transport/types.hpp"
2929
#include "libcyphal/types.hpp"

include/libcyphal/presentation/publisher_impl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "libcyphal/common/cavl/cavl.hpp"
1313
#include "libcyphal/transport/errors.hpp"
1414
#include "libcyphal/transport/msg_sessions.hpp"
15+
#include "libcyphal/transport/transfer_id_map.hpp"
1516
#include "libcyphal/transport/types.hpp"
1617
#include "libcyphal/types.hpp"
1718

include/libcyphal/transport/transfer_id_generators.hpp

Lines changed: 0 additions & 134 deletions
This file was deleted.

0 commit comments

Comments
 (0)