diff --git a/src/duneinterface/gitter_dune_pll_impl.cc b/src/duneinterface/gitter_dune_pll_impl.cc index 65205d0408ccae504e7515b939798603ab9796a2..b78fd04d1c01d11cfb5554cf47dce3f251418cfc 100644 --- a/src/duneinterface/gitter_dune_pll_impl.cc +++ b/src/duneinterface/gitter_dune_pll_impl.cc @@ -339,6 +339,7 @@ void GitterDunePll :: unpackOnMaster ( item.reserveBuffer( nl + 1 ); DataBufferType & data = item.commBuffer(); + // only gather master data once if ( dataHandle.containsItem( item ) ) { // pack master data @@ -383,6 +384,18 @@ void GitterDunePll :: sendMaster ( IteratorSTI < HItemType > & iter = *(a.first); + // create new link vector + vector< int > newLink( nl ); + for(int link=0; link<nl ; ++link) + { + newLink[ link ] = link; + } + + // if myLink == link then write master data + // instead of data of link + // we do not send link i its own data + newLink[myLink] = nl; + // for all master items for (iter.first (); ! iter.done () ; iter.next ()) { @@ -395,9 +408,11 @@ void GitterDunePll :: sendMaster ( for(int link = 0; link<nl; ++link) { BufferType & localBuff = dataBuff[link]; - if( localBuff.size() > 0 ) + + // check if stream has been read, if not scatter data + // this will unpack data on master only once + if( localBuff.validToRead() ) { - localBuff.resetReadPosition(); dataHandle.recvData(localBuff, item); } } @@ -410,12 +425,9 @@ void GitterDunePll :: sendMaster ( for(int link = 0; link<nl; ++link) { - // if myLink == link then write master data - // instead of data of link - // we do not send link i its own data - int l = (link == myLink) ? nl : link; - - BufferType & localBuff = dataBuff[l]; + // use new link to send master data to link we are sending for + BufferType & localBuff = dataBuff[ newLink[link] ]; + // get size int s = localBuff.size(); sendBuff.writeObject(s); // if buffer size > 0 write hole buffer to stream