35 hasInlineBlobs =
false;
36 hasSharedBufferBlobs =
false;
38 convertionToSharedBuffer =
nullptr;
39 convertionToInline =
nullptr;
45 if (attached ==
"true")
47 hasSharedBufferBlobs =
true;
51 hasInlineBlobs =
true;
59 assert(convertionToSharedBuffer ==
nullptr);
60 assert(convertionToInline ==
nullptr);
63 releaseSharedBuffers(std::set<int>());
68 if (msg == convertionToSharedBuffer)
70 convertionToSharedBuffer =
nullptr;
73 if (msg == convertionToInline)
75 convertionToInline =
nullptr;
82void Msg::releaseXmlContent()
84 if (xmlContent !=
nullptr)
91void Msg::releaseSharedBuffers(
const std::set<int> &keep)
93 for(
size_t i = 0; i < sharedBuffers.size(); ++i)
95 auto fd = sharedBuffers[i];
96 if (
fd != -1 && keep.find(
fd) == keep.end())
100 perror(
"Releasing shared buffer");
102 sharedBuffers[i] = -1;
111 if (convertionToSharedBuffer)
115 if (convertionToInline)
125 releaseSharedBuffers(req.sharedBuffers);
128 if (convertionToSharedBuffer ==
nullptr && convertionToInline ==
nullptr)
134bool Msg::fetchBlobs(std::list<int> &incomingSharedBuffers)
142 log(
"Attached blob misses the size attribute");
147 if (attached ==
"true")
149 if (incomingSharedBuffers.empty())
151 log(
"Missing shared buffer...\n");
155 queueSize += blobSize;
157 int fd = *incomingSharedBuffers.begin();
158 incomingSharedBuffers.pop_front();
160 sharedBuffers.push_back(
fd);
177 Msg * m =
new Msg(from, root);
178 if (!m->fetchBlobs(incomingSharedBuffers))
188 if (convertionToSharedBuffer)
190 return convertionToSharedBuffer;
194 if (hasInlineBlobs && from)
198 return convertionToSharedBuffer;
203 if (convertionToInline)
205 return convertionToInline;
213 if (hasSharedBufferBlobs || hasInlineBlobs)
217 return buildConvertionToSharedBuffer();
221 return buildConvertionToInline();
227 return buildConvertionToInline();
void log(const std::string &log)
bool parseBlobSize(XMLEle *blobWithAttachedBuffer, ssize_t &size)
std::vector< XMLEle * > findBlobElements(XMLEle *root)
virtual bool acceptSharedBuffers() const
SerializedMsg * serialize(MsgQueue *from)
Msg(MsgQueue *from, XMLEle *root)
friend class SerializedMsgWithSharedBuffer
friend class SerializedMsgWithoutSharedBuffer
static Msg * fromXml(MsgQueue *from, XMLEle *root, std::list< int > &incomingSharedBuffers)
void collectRequirements(SerializationRequirement &req)
void blockReceiver(MsgQueue *toblock)
const char * findXMLAttValu(XMLEle *ep, const char *name)
Find an XML element's attribute value.
size_t sprlXMLEle(XMLEle *ep, int level)
return number of bytes in a string guaranteed able to hold result of sprXLMEle(ep) (sans trailing \0@...
void delXMLEle(XMLEle *ep)
delXMLEle Delete XML element.