@@ -55,6 +55,8 @@ class ConsumerFMQchannel: public Consumer {
5555 int memoryPoolNumberOfPages;
5656
5757 public:
58+ std::vector<FairMQMessagePtr> messagesToSend; // collect HBF messages of each update
59+
5860
5961
6062 ConsumerFMQchannel (ConfigFile &cfg, std::string cfgEntryPoint) : Consumer(cfg,cfgEntryPoint) {
@@ -225,8 +227,8 @@ class ConsumerFMQchannel: public Consumer {
225227
226228 // create a header message
227229 // std::unique_ptr<FairMQMessage> msgHeader(transportFactory->CreateMessage((void *)stfHeader, sizeof(SubTimeframe), cleanupCallback, (void *)(blockRef)));
228- std::unique_ptr<FairMQMessage> msgHeader (transportFactory-> CreateMessage (memoryBuffer,( void *)stfHeader, sizeof (SubTimeframe), ( void *)(blockRef) ));
229- sendingChannel->Send (msgHeader );
230+ assert (messagesToSend. empty ( ));
231+ messagesToSend. emplace_back ( std::move ( sendingChannel->NewMessage (memoryBuffer,( void *)stfHeader, sizeof (SubTimeframe), ( void *)(blockRef))) );
230232 // printf("sent header %d bytes\n",(int)sizeof(SubTimeframe));
231233
232234
@@ -252,8 +254,8 @@ class ConsumerFMQchannel: public Consumer {
252254 // printf("allocating blockRef %p for %p\n",pf.blockRef,br);
253255 pendingFrames.push_back (pf);
254256 };
255-
256- auto pendingFramesSend = [&]() {
257+
258+ auto pendingFramesCollect = [&]() {
257259 int nFrames=pendingFrames.size ();
258260
259261 if (nFrames==0 ) {
@@ -271,8 +273,10 @@ class ConsumerFMQchannel: public Consumer {
271273 void *hint=(void *)pendingFrames[0 ].blockRef ;
272274 // printf("block %p ix = %d : %d hint=%p\n",(void *)(&(b->data[ix])),ix,l,hint);
273275 // std::cout << typeid(pendingFrames[0].blockRef).name() << std::endl;
274- std::unique_ptr<FairMQMessage> msgBody (transportFactory->CreateMessage (memoryBuffer,(void *)(&(b->data [ix])),(size_t )(l),hint));
275- sendingChannel->Send (msgBody);
276+
277+ // create and queue a fmq message
278+ messagesToSend.emplace_back (std::move (sendingChannel->NewMessage (memoryBuffer,(void *)(&(b->data [ix])),(size_t )(l),hint)));
279+
276280 // printf("sent single HB %d = %d bytes\n",pendingFrames[0].HBid,l);
277281 // printf("left to FMQ: %p\n",pendingFrames[0].blockRef);
278282
@@ -319,10 +323,9 @@ class ConsumerFMQchannel: public Consumer {
319323
320324 // std::unique_ptr<FairMQMessage> msgBody(transportFactory->CreateMessage((void *)newBlock, totalSize, cleanupCallbackForMalloc, (void *)(newBlock)));
321325 // sendingChannel->Send(msgBody);
322-
323- // create a fmq message
324- std::unique_ptr<FairMQMessage> msgCopy (transportFactory->CreateMessage (memoryBuffer,(void *)newBlock, totalSize, (void *)(blockRef)));
325- sendingChannel->Send (msgCopy);
326+
327+ // create and queue a fmq message
328+ messagesToSend.emplace_back (std::move (sendingChannel->NewMessage (memoryBuffer,(void *)newBlock, totalSize, (void *)(blockRef))));
326329
327330 // printf("sent reallocated HB %d (originally %d blocks) = %d bytes\n",pendingFrames[0].HBid,nFrames,totalSize);
328331 }
@@ -346,7 +349,7 @@ class ConsumerFMQchannel: public Consumer {
346349 pendingFramesAppend (HBstart,HBlength,lastHBid,br);
347350 }
348351 // send pending frames, if any
349- pendingFramesSend ();
352+ pendingFramesCollect ();
350353
351354 // update new HB frame
352355 HBstart=offset;
@@ -361,8 +364,14 @@ class ConsumerFMQchannel: public Consumer {
361364 }
362365
363366 // purge pendingFrames
364- pendingFramesSend ();
365-
367+ pendingFramesCollect ();
368+
369+ // send all the messages
370+ if (sendingChannel->Send (messagesToSend) >= 0 )
371+ messagesToSend.clear ();
372+ else
373+ LOG (ERROR) << " Sending failed!" ;
374+
366375 /*
367376
368377 std::unique_ptr<FairMQMessage> msgBody(transportFactory->CreateMessage((void *)(&b->data[HBstart]), (size_t)(HBlength), cleanupCallback, (void *)(ptr)));
0 commit comments