1 #include "hmbdc/Copyright.hpp"
3 #include "hmbdc/app/utils/NetContextUtil.hpp"
4 #include "hmbdc/app/Config.hpp"
5 #include "hmbdc/app/netmap/Messages.hpp"
6 #include "hmbdc/app/netmap/Sender.hpp"
7 #include "hmbdc/app/netmap/SendTransportEngine.hpp"
8 #include "hmbdc/app/netmap/RecvTransportEngine.hpp"
9 #include "hmbdc/app/netmap/DefaultUserConfig.hpp"
11 #include "hmbdc/comm/Topic.hpp"
12 #include "hmbdc/pattern/GuardedSingleton.hpp"
14 #include <unordered_map>
25 namespace hmbdc {
namespace app {
namespace netmap {
46 template <
typename Buffer,
typename MsgArbitrator = RecvTransport::NoOpArb>
65 std::lock_guard<std::mutex> tlock(sendTransportEnginesLock_);
66 auto id = cfg.
getExt<std::string>(
"hmbdcName");
67 if (sendTransportEngines_.find(
id) != sendTransportEngines_.end()) {
68 HMBDC_THROW(std::runtime_error
69 ,
"seemingly recreating the same engine, "
70 "same hmbdcNamed engin already created with hmbdcName=" <<
id);
73 sendTransportEngines_.emplace(
id, SendTransportEngine::ptr(res));
82 ,
size_t maxMessageSize
83 , std::tuple<> args) {
104 template <
typename Buffer,
typename MsgArbitrator = RecvTransport::NoOpArb>
112 std::lock_guard<std::mutex> tlock(recvTransportEnginesLock_);
115 , std::forward<MsgArbitrator>(arb));
116 recvTransportEngines_.emplace_back(res);
124 template <
typename Buffer,
typename ArgsTuple>
128 , ArgsTuple&& args) {
143 std::lock_guard<std::mutex> lock(sendersLock_);
144 auto sender = senders_.find(t);
145 if ( sender != senders_.end()) {
146 return sender->second.get();
148 std::lock_guard<std::mutex> slock(sendTransportEnginesLock_);
149 for (
auto& s : sendTransportEngines_) {
152 auto newSender =
new Sender(st, t);
153 senders_[t].reset(newSender);
170 std::lock_guard<std::mutex> tlock(recvTransportEnginesLock_);
171 for (
auto r : recvTransportEngines_) {
182 std::lock_guard<std::mutex> tlock(recvTransportEnginesLock_);
183 for (
auto r : recvTransportEngines_) {
211 template <
typename CcContext>
213 , Config::Base cfgIn = Config::Base{}
214 ,
char const* sendSec = nullptr
215 ,
char const* recvSec = nullptr
216 ,
size_t maxMessageSize = 0
217 , uint8_t runningUsingThreadIndex = 0
218 ,
char const* listenToTopic =
"_")
219 : runningCtx(0u, 2ul) {
220 createMinimumNetContext(
221 *
this, runningCtx, ctx, cfgIn, sendSec, recvSec, maxMessageSize, runningUsingThreadIndex, listenToTopic);
235 std::unordered_map<std::string, SendTransportEngine::ptr> sendTransportEngines_;
236 std::mutex sendTransportEnginesLock_;
238 std::vector<RecvTransport::ptr> recvTransportEngines_;
239 std::mutex recvTransportEnginesLock_;
241 std::map<comm::Topic, Sender::ptr> senders_;
242 uint32_t sendTransportRotationIndex_;
243 std::mutex sendersLock_;
void setDefaultUserConfig(Config const &c)
depracated
Definition: Config.hpp:165
class to hold an hmbdc configuration
Definition: Config.hpp:46
NetContext()
this is for users that want finer control of engine creation - from a blank NetContext.
Definition: NetContext.hpp:228
topic as in the publish / subscribe communication paradigm
Definition: Topic.hpp:14
fascade class for sending network messages
Definition: Sender.hpp:11
Definition: NetContextUtil.hpp:10
base for the Singleton that works with SingletonGuardian
Definition: GuardedSingleton.hpp:53
RAII representing the lifespan of the underlying Singleton which also ganrantees the singularity of u...
Definition: GuardedSingleton.hpp:20
void listenTo(comm::Topic const &t)
This process is interested in a Topic.
Definition: NetContext.hpp:169
SendTransportEngine * createSendTransportEngineTuply(Config const &cfg, size_t maxMessageSize, std::tuple<> args)
same as above but provide an unified interface - not preferred
Definition: NetContext.hpp:81
T getExt(const path_type ¶m, bool throwIfMissing=true) const
get a value from the config
Definition: Config.hpp:225
NetContext(CcContext &ctx, Config::Base cfgIn=Config::Base{}, char const *sendSec=nullptr, char const *recvSec=nullptr, size_t maxMessageSize=0, uint8_t runningUsingThreadIndex=0, char const *listenToTopic="_")
this ctor is to create some commonly used basic engine setup to start with. This is private and only ...
Definition: NetContext.hpp:212
auto createRecvTransportEngineTuply(Config const &cfg, Buffer &buffer, ArgsTuple &&args)
same as above but to provide a unified interface - not preferred
Definition: NetContext.hpp:125
power a netmap port sending functions
Definition: SendTransportEngine.hpp:44
SendTransportEngine * createSendTransportEngine(Config const &cfgIn, size_t maxMessageSize)
construct a send transport and remember it
Definition: NetContext.hpp:60
impl class,
Definition: RecvTransportEngine.hpp:70
A Context is like a media object that facilitates the communications for the Clients that it is holdi...
Definition: Context.hpp:477
auto createRecvTransportEngine(Config const &cfgIn, Buffer &buffer, MsgArbitrator &&arb=RecvTransport::NoOpArb())
construct a recv transport and remember it
Definition: NetContext.hpp:105
char const *const DefaultUserConfig
Definition: DefaultUserConfig.hpp:10
a singleton that holding netmap resources
Definition: NetContext.hpp:38
a take all arbitrator (no arbitration at all)
Definition: RecvTransportEngine.hpp:50
void stopListenTo(comm::Topic const &t)
undo the subscription
Definition: NetContext.hpp:181
Sender * getSender(comm::Topic const &t)
get (or create for the first time) a Sender - whose function is to send messages on its associated To...
Definition: NetContext.hpp:142