1 #include "hmbdc/Copyright.hpp" 3 #include "hmbdc/app/Message.hpp" 4 #include "hmbdc/pattern/GuardedSingleton.hpp" 9 namespace hmbdc {
namespace app {
namespace utils {
11 namespace netportal_detail {
12 template <
typename ...RecvMessages>
13 uint32_t itemSizePower2Num() {
15 auto valueTypeSize = max_size_in_tuple<std::tuple<RecvMessages...>>::value
17 while ((1ul << res) < valueTypeSize) res++;
36 template <
typename NetContext,
typename SendMessageTuple
37 ,
typename RecvMessageTuple = std::tuple<>>
40 template <
typename NetContext, MessageC ... SendMessages, MessageC ... RecvMessages>
41 struct NetPortal<NetContext,
std::tuple<SendMessages...>, std::tuple<RecvMessages...>> {
52 : outOneBuffer_(netportal_detail::itemSizePower2Num<RecvMessages...>())
53 , sendEng_(sizeof...(SendMessages)?NetContext::instance().createSendTransportEngine(
54 (cfg.put(
"connKeyCheck", false), cfg.resetSection(
"tx", false))
57 , recvEng_(sizeof...(RecvMessages)?NetContext::instance().createRecvTransportEngine(
58 cfg.resetSection(
"rx", false)
71 if (hmbdc_likely(recvEng_)) recvEng_->rotate();
72 if (hmbdc_likely(sendEng_)) sendEng_->rotate();
92 template <
typename MesssageRecver
93 ,
typename MesssageRecverInterestsTuple = std::tuple<RecvMessages...>>
94 size_t pullIn(MesssageRecver&& recver) {
95 outOneBuffer_.dispCount = 0;
96 if (hmbdc_likely(recvEng_)) {
97 outOneBuffer_.postCommit = [&recver](
MessageHead& h) {
98 using M =
typename std::decay<MesssageRecver>::type;
99 MessageDispacher<M, MesssageRecverInterestsTuple> disp;
100 return disp(recver, h);
103 outOneBuffer_.postCommit
106 return outOneBuffer_.dispCount;
120 if (hmbdc_likely(sendEng_)) sendEng_->rotate();
132 if (sendEng_ && sendEng_->match(t))
133 return NetContext::instance().getSender(t);
153 if (recvEng_) recvEng_->listenTo(t);
164 if (recvEng_) recvEng_->stopListenTo(t);
176 return sendEng_?sendEng_->sessionsRemainingActive():0;
187 return recvEng_?recvEng_->sessionsRemainingActive():0;
193 using value_type =
void *;
194 const size_t valueTypeSize;
196 std::function<bool (MessageHead&)> postCommit
198 size_t dispCount = 0;
200 OneBuffer(
size_t valueTypeSizePower2Num)
201 : valueTypeSize(1ul << valueTypeSizePower2Num)
202 , buffer(valueTypeSizePower2Num, 0) {}
204 size_t capacity()
const {
return 1;};
205 size_t maxItemSize()
const {
return valueTypeSize;}
206 void put(
void* item,
size_t sizeHint = 0) {
211 template <
typename T>
void put(T& item) {put(&item,
sizeof(T));}
212 template <
typename T>
void putSome(T& item) {put(&item, std::min(
sizeof(item), maxItemSize()));}
222 OneBuffer outOneBuffer_;
223 using SendTransportEngine =
typename NetContext::SendTransportEngine;
224 SendTransportEngine* sendEng_;
225 using RecvTransportEngine =
typename NetContext::template RecvTransportEngine<OneBuffer>;
226 RecvTransportEngine* recvEng_;
class to hold an hmbdc configuration
Definition: Config.hpp:46
NetContext::Sender * getSender(comm::Topic const &t)
get a sender for a topic
Definition: NetPortal.hpp:131
topic as in the publish / subscribe communication paradigm
Definition: Topic.hpp:14
auto getSendEngine()
get a send engineng
Definition: NetPortal.hpp:141
size_t pullIn(MesssageRecver &&recver)
get the incoming messages and dispatch them to the receiving code
Definition: NetPortal.hpp:94
Definition: Message.hpp:78
void stopListenTo(comm::Topic const &t)
stop listening to a topic - has impact on the pullIn call
Definition: NetPortal.hpp:163
void flushOut()
just run the portal part that send messages
Definition: NetPortal.hpp:119
void listenTo(comm::Topic const &t)
listen to a topic - has impact on the pullIn call
Definition: NetPortal.hpp:152
Definition: MetaUtils.hpp:96
size_t sendSessionsRemainingActive() const
the sending session that are active which is how many receiver are active
Definition: NetPortal.hpp:175
size_t recvSessionsRemainingActive() const
the recving session that are active which is how many sending parties are active
Definition: NetPortal.hpp:186
void rotate()
run the portal to send and receive messages
Definition: NetPortal.hpp:70
an utility that gives finer control to the user that do not rely on hmbdc Contexts ...
Definition: NetPortal.hpp:38
NetPortal(Config cfg)
ctor - only can be called after the NetContext singleton is created
Definition: NetPortal.hpp:51
Definition: LockFreeBufferMisc.hpp:89