1 #include "hmbdc/Copyright.hpp" 3 #include "hmbdc/app/Message.hpp" 7 namespace hmbdc {
namespace tips {
namespace reliable {
8 template <
typename Buffer,
typename TransportMessageHeader,
typename AttachmentAllocator>
12 std::unique_ptr<uint8_t[]> hasMemoryAttachmentMessageWrapSpace_;
15 size_t attTrainCount_ = 0;
16 AttachmentAllocator alloc_;
19 hasMemoryAttachment_->release();
20 hasMemoryAttachment_ =
nullptr;
26 , hasMemoryAttachmentMessageWrapSpace_{
new uint8_t[maxItemSize()] {0}}
28 hasMemoryAttachmentMessageWrapSpace_.get())
31 size_t maxItemSize()
const {
32 return buffer_.maxItemSize();
34 void put(TransportMessageHeader* h) {
37 if (hmbdc_unlikely(h->typeTag() == StartMemorySegTrain::typeTag)) {
38 if (hmbdc_likely(!hasMemoryAttachment_)) {
39 hasMemoryAttachment_ = &hasMemoryAttachmentMessageWrap_->get<hasMemoryAttachment>();
40 *hasMemoryAttachment_ =
41 h->template wrapped<StartMemorySegTrain>().att;
42 attTrainCount_ = h->template wrapped<StartMemorySegTrain>().segCount;
43 alloc_(h->typeTag(), hasMemoryAttachment_);
45 hasMemoryAttachment_->len = 0;
48 }
else if (hmbdc_unlikely(hasMemoryAttachment_
49 && h->typeTag() == MemorySeg::typeTag)) {
51 auto seg = &h->template wrapped<MemorySeg>();
52 auto segLen = h->messagePayloadLen - (uint16_t)
sizeof(MessageHead);
53 memcpy((
char*)hasMemoryAttachment_->attachment + hasMemoryAttachment_->len, seg, segLen);
54 hasMemoryAttachment_->len += segLen;
59 }
else if (hmbdc_unlikely(hasMemoryAttachment_)) {
60 if (hmbdc_likely(!attTrainCount_)
61 && h->flag == app::hasMemoryAttachment::flag) {
62 auto l = std::min<size_t>(buffer_.maxItemSize(), h->messagePayloadLen);
63 auto hsm = *hasMemoryAttachment_;
64 memcpy(hasMemoryAttachmentMessageWrapSpace_.get(), h->payload(), l);
65 *hasMemoryAttachment_ = hsm;
66 buffer_.putAtt(hasMemoryAttachmentMessageWrap_, buffer_.maxItemSize());
67 hasMemoryAttachment_ =
nullptr;
72 buffer_.put(h->payload(), h->messagePayloadLen);
77 template <
typename T>
void putSome(T& item) {
78 buffer_.put(&item, std::min(
sizeof(item), maxItemSize()));
Definition: AttBufferAdaptor.hpp:9
Definition: Message.hpp:263
if a specific hmbdc network transport (for example tcpcast, rmcast, and rnetmap) supports message wit...
Definition: Message.hpp:125