1 #include "hmbdc/Copyright.hpp"
3 #include "hmbdc/app/Message.hpp"
4 #include "hmbdc/pattern/GuardedSingleton.hpp"
6 namespace hmbdc {
namespace app {
namespace utils {
8 namespace netportal_detail {
9 template <
typename MesssageRecver, MessageC... RecvMessages>
10 struct Proxy :
Client<Proxy<MesssageRecver, RecvMessages...>, RecvMessages ...> {
11 Proxy(MesssageRecver&& recver)
12 : recver(std::forward<MesssageRecver>(recver)){}
13 MesssageRecver&& recver;
15 template <MessageC Message>
16 void handleMessageCb(Message&& message) {
18 recver.handleMessageCb(std::forward<Message>(message));
38 template <
typename NetContext,
typename SendMessageTuple
39 ,
typename RecvMessageTuple = std::tuple<>>
42 template <
typename NetContext, MessageC ... SendMessages, MessageC ... RecvMessages>
43 struct NetPortal<NetContext, std::tuple<SendMessages...>, std::tuple<RecvMessages...>> {
55 : ctx_(messageQueueSizePower2Num, 0)
56 , sendEng_(sizeof...(SendMessages)?NetContext::instance().createSendTransportEngine(
57 (cfg.put(
"connKeyCheck", false), cfg.resetSection(
"tx", false))
60 , recvEng_(sizeof...(RecvMessages)?NetContext::instance().createRecvTransportEngine(
61 cfg.resetSection(
"rx", false)
74 if (hmbdc_likely(recvEng_)) recvEng_->rotate();
75 if (hmbdc_likely(sendEng_)) sendEng_->rotate();
91 template <
typename MesssageRecver>
92 size_t pullIn(MesssageRecver&& recver) {
94 if (hmbdc_likely(recvEng_)) recvEng_->rotate();
96 Proxy proxy(std::forward<MesssageRecver>(recver));
97 ctx_.runClientThreadOnce(0, proxy);
112 if (hmbdc_likely(sendEng_)) sendEng_->rotate();
124 if (sendEng_ && sendEng_->match(t))
125 return NetContext::instance().getSender(t);
137 if (recvEng_) recvEng_->listenTo(t);
148 if (recvEng_) recvEng_->stopListenTo(t);
160 return sendEng_?sendEng_->sessionsRemainingActive():0;
168 using SendTransportEngine =
typename NetContext::SendTransportEngine;
169 SendTransportEngine* sendEng_;
170 using RecvTransportEngine =
typename NetContext::template RecvTransportEngine<typename Ctx::Buffer>;
171 RecvTransportEngine* recvEng_;
size_t sendSessionsRemainingActive() const
the sending session that are active which is how many receiver are active
Definition: NetPortal.hpp:159
class to hold an hmbdc configuration
Definition: Config.hpp:46
NetPortal(Config cfg, size_t messageQueueSizePower2Num=20)
ctor - only can be called after the NetContext singleton is created
Definition: NetPortal.hpp:54
Definition: NetPortal.hpp:10
topic as in the publish / subscribe communication paradigm
Definition: Topic.hpp:14
Context template parameter inidcating each message is sent to one and only one of the clients within ...
Definition: Context.hpp:77
void stopListenTo(comm::Topic const &t)
stop listening to a topic - has impact on the pullIn call
Definition: NetPortal.hpp:147
void flushOut()
just run the portal part that send messages
Definition: NetPortal.hpp:111
void rotate()
run the portal to send and receive messages
Definition: NetPortal.hpp:73
NetContext::Sender * getSender(comm::Topic const &t)
get a sender for a topic
Definition: NetPortal.hpp:123
void listenTo(comm::Topic const &t)
listen to a topic - has impact on the pullIn call
Definition: NetPortal.hpp:136
size_t pullIn(MesssageRecver &&recver)
just run the portal part that receives messages
Definition: NetPortal.hpp:92
A Context is like a media object that facilitates the communications for the Clients that it is holdi...
Definition: Context.hpp:477
Definition: MetaUtils.hpp:96
A Client represents a thread of execution/a task. The execution is managed by a Context. a Client object could participate in message dispatching as the receiver of specifed message types.
Definition: Client.hpp:57
an utility that gives finer control to the user that do not rely on hmbdc Contexts ...
Definition: NetPortal.hpp:40