13
13
#include " libcyphal/executor.hpp"
14
14
#include " libcyphal/transport/errors.hpp"
15
15
#include " libcyphal/transport/svc_sessions.hpp"
16
- #include " libcyphal/transport/transfer_id_generators .hpp"
16
+ #include " libcyphal/transport/transfer_id_map .hpp"
17
17
#include " libcyphal/transport/types.hpp"
18
18
#include " libcyphal/types.hpp"
19
19
@@ -34,7 +34,9 @@ namespace presentation
34
34
namespace detail
35
35
{
36
36
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
38
40
{
39
41
public:
40
42
using Node::remove;
@@ -135,6 +137,7 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
135
137
, svc_response_rx_session_{std::move (svc_response_rx_session)}
136
138
, response_rx_params_{svc_response_rx_session_->getParams ()}
137
139
, nearest_deadline_{DistantFuture ()}
140
+ , transfer_id_{0 }
138
141
{
139
142
CETL_DEBUG_ASSERT (svc_request_tx_session_ != nullptr , " " );
140
143
CETL_DEBUG_ASSERT (svc_response_rx_session_ != nullptr , " " );
@@ -144,7 +147,7 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
144
147
// Otherwise, the responses would be rejected (as "duplicates") if their transfer IDs are in order.
145
148
// Real duplicates (f.e. caused by redundant transports) won't cause any issues
146
149
// 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.
148
151
svc_response_rx_session_->setTransferIdTimeout ({});
149
152
150
153
svc_response_rx_session_->setOnReceiveCallback ([this ](const auto & arg) {
@@ -243,6 +246,18 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
243
246
delegate_.forgetSharedClient (*this );
244
247
}
245
248
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
+
246
261
protected:
247
262
virtual void insertNewCallbackNode (CallbackNode& callback_node)
248
263
{
@@ -392,15 +407,16 @@ class SharedClient : public common::cavl::Node<SharedClient>, public SharedObjec
392
407
TimePoint nearest_deadline_;
393
408
common::cavl::Tree<TimeoutNode> timeout_nodes_by_deadline_;
394
409
IExecutor::Callback::Any nearest_deadline_callback_;
410
+ transport::TransferId transfer_id_;
395
411
396
412
}; // SharedClient
397
413
398
414
// MARK: -
399
415
400
416
// / @brief Defines a shared client implementation that uses a generic transfer ID generator.
401
417
// /
402
- template <typename TransferIdGeneratorMixin >
403
- class ClientImpl final : public SharedClient, private TransferIdGeneratorMixin
418
+ template <typename TransferIdGenerator >
419
+ class ClientImpl final : public SharedClient
404
420
{
405
421
public:
406
422
ClientImpl (IPresentationDelegate& delegate,
@@ -409,7 +425,7 @@ class ClientImpl final : public SharedClient, private TransferIdGeneratorMixin
409
425
UniquePtr<transport::IResponseRxSession> svc_response_rx_session,
410
426
const transport::TransferId transfer_id_modulo)
411
427
: 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 }
413
429
{
414
430
}
415
431
@@ -424,40 +440,41 @@ class ClientImpl final : public SharedClient, private TransferIdGeneratorMixin
424
440
private:
425
441
using Base = SharedClient;
426
442
427
- // MARK: SharedClient
428
-
429
- CETL_NODISCARD cetl::optional<transport::TransferId> nextTransferId () noexcept override
430
- {
431
- return TransferIdGeneratorMixin::nextTransferId ();
432
- }
433
-
434
443
void insertNewCallbackNode (CallbackNode& callback_node) override
435
444
{
436
445
SharedClient::insertNewCallbackNode (callback_node);
437
- TransferIdGeneratorMixin:: retainTransferId (callback_node.getTransferId ());
446
+ transfer_id_generator_. retainTransferId (callback_node.getTransferId ());
438
447
}
439
448
440
449
void removeCallbackNode (CallbackNode& callback_node) override
441
450
{
442
- TransferIdGeneratorMixin:: releaseTransferId (callback_node.getTransferId ());
451
+ transfer_id_generator_. releaseTransferId (callback_node.getTransferId ());
443
452
SharedClient::removeCallbackNode (callback_node);
444
453
}
445
454
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
+
446
464
}; // ClientImpl<TransferIdGeneratorMixin>
447
465
448
466
// / @brief Defines a shared client specialization that uses a trivial transfer ID generator.
449
467
// /
450
468
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
454
470
{
455
471
public:
456
472
ClientImpl (IPresentationDelegate& delegate,
457
473
IExecutor& executor,
458
474
UniquePtr<transport::IRequestTxSession> svc_request_tx_session,
459
475
UniquePtr<transport::IResponseRxSession> svc_response_rx_session)
460
476
: Base{delegate, executor, std::move (svc_request_tx_session), std::move (svc_response_rx_session)}
477
+ , transfer_id_generator_{*this }
461
478
{
462
479
}
463
480
@@ -476,9 +493,11 @@ class ClientImpl<transport::detail::TrivialTransferIdGenerator> final
476
493
477
494
CETL_NODISCARD cetl::optional<transport::TransferId> nextTransferId () noexcept override
478
495
{
479
- return TrivialTransferIdGenerator:: nextTransferId ();
496
+ return transfer_id_generator_. nextTransferId ();
480
497
}
481
498
499
+ transport::detail::TrivialTransferIdGenerator transfer_id_generator_;
500
+
482
501
}; // ClientImpl<TrivialTransferIdGenerator>
483
502
484
503
} // namespace detail
0 commit comments