31 for(
auto fd : parent->sharedBuffers)
35 requirements.sharedBuffers.insert(
fd);
38 requirements.xml =
true;
40 asyncProgress.set<
SerializedMsg, &SerializedMsg::async_progressed>(
this);
54 std::lock_guard<std::recursive_mutex> guard(lock);
60 std::lock_guard<std::recursive_mutex> guard(lock);
61 if (this->requirements == req)
65 this->requirements = req;
71 std::lock_guard<std::recursive_mutex> guard(lock);
73 this->chuncks.push_back(m);
79 std::lock_guard<std::recursive_mutex> guard(lock);
84void SerializedMsg::async_start()
86 std::lock_guard<std::recursive_mutex> guard(lock);
95 asyncProgress.start();
97 std::thread t([
this]()
109void SerializedMsg::async_progressed()
111 std::lock_guard<std::recursive_mutex> guard(lock);
116 asyncProgress.stop();
122 awaiter->messageMayHaveProgressed(
this);
131 std::lock_guard<std::recursive_mutex> guard(lock);
139 std::lock_guard<std::recursive_mutex> guard(lock);
152 if (position.chunckId < chuncks.size())
161 std::vector<
int, std::allocator<int> > &sharedBuffers)
163 std::lock_guard<std::recursive_mutex> guard(lock);
171 if (from.chunckId == chuncks.size())
176 from.endReached =
true;
180 const MsgChunck &ck = chuncks[from.chunckId];
182 if (from.chunckOffset == 0)
184 sharedBuffers = ck.sharedBufferIdsToAttach;
188 sharedBuffers.clear();
191 data = ck.content + from.chunckOffset;
192 size = ck.contentLength - from.chunckOffset;
198 std::lock_guard<std::recursive_mutex> guard(lock);
201 iter.chunckOffset += s;
202 if (iter.chunckOffset >= cur.contentLength)
205 iter.chunckOffset = 0;
208 iter.endReached =
true;
223 owner->releaseSerialization(
this);
229 sr.add(requirements);
241 return owner->queueSize;
void async_updateRequirement(const SerializationRequirement &n)
SerializationStatus asyncStatus
bool getContent(MsgChunckIterator &position, void *&data, ssize_t &nsend, std::vector< int > &sharedBuffers)
virtual bool generateContentAsync() const =0
MsgQueue * blockedProducer
void collectRequirements(SerializationRequirement &req)
std::list< void * > ownBuffers
void blockReceiver(MsgQueue *toblock)
bool requestContent(const MsgChunckIterator &position)
std::set< MsgQueue * > awaiters
virtual void generateContent()=0
SerializedMsg(Msg *parent)
void advance(MsgChunckIterator &position, ssize_t s)
void addAwaiter(MsgQueue *awaiter)
void release(MsgQueue *from)
void async_pushChunck(const MsgChunck &m)
std::unique_ptr< RadioSim > receiver(new RadioSim())