diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C index a970d6104cef67f4fd68e867bbdb73b8b839f97f..884276809857d563b8be24f4cfe984f47bd1da9a 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C @@ -38,7 +38,8 @@ Foam::IPstream::IPstream ) : Pstream(commsType, bufSize), - UIPstream(commsType, fromProcNo, buf_) + UIPstream(commsType, fromProcNo, buf_, externalBufPosition_), + externalBufPosition_(0) {} diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.H index acc59de87bf045db5171eec073e39c8030f5c83f..201e1b7f1d324e9926a1d4eb10cd49125d5aedde 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.H +++ b/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.H @@ -55,6 +55,9 @@ class IPstream public UIPstream { + //- Receive index + label externalBufPosition_; + public: // Constructors diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C index 41cb1c4f110bc75c61dfdcd904812cc77d13eac3..b2e4d8df06dd8be31eeaef26c4fa37e9ee88901e 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C @@ -51,10 +51,31 @@ Foam::PstreamBuffers::PstreamBuffers version_(version), sendBuf_(UPstream::nProcs()), recvBuf_(UPstream::nProcs()), + recvBufPos_(UPstream::nProcs(), 0), finishedSendsCalled_(false) {} +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::PstreamBuffers::~PstreamBuffers() +{ + // Check that all data has been consumed. + forAll(recvBufPos_, procI) + { + if (recvBufPos_[procI] < recvBuf_[procI].size()) + { + FatalErrorIn("PstreamBuffers::~PstreamBuffers()") + << "Message from processor " << procI + << " not fully consumed. messageSize:" << recvBuf_[procI].size() + << " bytes of which only " << recvBufPos_[procI] + << " consumed." + << Foam::abort(FatalError); + } + } +} + + // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // void Foam::PstreamBuffers::finishedSends(const bool block) diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.H b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.H index 75f26f1d6a9468d6caba8174921895dbf84fe1b2..c2dc745beac925af1a48362787dd740036a76ca6 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.H +++ b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.H @@ -106,6 +106,9 @@ class PstreamBuffers //- receive buffer List<DynamicList<char> > recvBuf_; + //- read position in recvBuf_ + labelList recvBufPos_; + bool finishedSendsCalled_; // Private member functions @@ -129,6 +132,10 @@ public: IOstream::versionNumber version=IOstream::currentVersion ); + // Destructor + + ~PstreamBuffers(); + // Member functions diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C index 4c38db6c692cb0598618a85b5496519fdc7f7d9d..f4c37633f352cde9c57fed2b48d1a6e31ec9a449 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C @@ -77,20 +77,6 @@ inline void Foam::UIPstream::readFromBuffer } -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -Foam::UIPstream::~UIPstream() -{ - if (externalBufPosition_ < messageSize_) - { - FatalErrorIn("UIPstream::~UIPstream()") - << "Message not fully consumed. messageSize:" << messageSize_ - << " bytes of which only " << externalBufPosition_ - << " consumed." << Foam::abort(FatalError); - } -} - - // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // Foam::Istream& Foam::UIPstream::read(token& t) diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H index aebef123b1586d5855ac301feda4779c60fef8ef..30e4e9611976bad7c21b42fe5186b30a8d5c396b 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H @@ -63,7 +63,7 @@ class UIPstream DynamicList<char>& externalBuf_; - label externalBufPosition_; + label& externalBufPosition_; const int tag_; @@ -94,6 +94,7 @@ public: const commsTypes commsType, const int fromProcNo, DynamicList<char>& externalBuf, + label& externalBufPosition, const int tag = UPstream::msgType(), streamFormat format=BINARY, versionNumber version=currentVersion @@ -103,11 +104,6 @@ public: UIPstream(const int fromProcNo, PstreamBuffers&); - // Destructor - - ~UIPstream(); - - // Member functions // Inquiry diff --git a/src/Pstream/dummy/UIPread.C b/src/Pstream/dummy/UIPread.C index a91a007e43eb60a60926d6ab3f6ed6c39743f1b5..da9613af37d1c807336171b32eab946d3cc1a59a 100644 --- a/src/Pstream/dummy/UIPread.C +++ b/src/Pstream/dummy/UIPread.C @@ -36,6 +36,7 @@ Foam::UIPstream::UIPstream const commsTypes commsType, const int fromProcNo, DynamicList<char>& externalBuf, + label& externalBufPosition, const int tag, streamFormat format, versionNumber version @@ -45,7 +46,7 @@ Foam::UIPstream::UIPstream Istream(format, version), fromProcNo_(fromProcNo), externalBuf_(externalBuf), - externalBufPosition_(0), + externalBufPosition_(externalBufPosition), tag_(tag), messageSize_(0) { @@ -56,6 +57,7 @@ Foam::UIPstream::UIPstream "const commsTypes," "const int fromProcNo," "DynamicList<char>&," + "label&," "const int tag," "streamFormat, versionNumber" ")" diff --git a/src/Pstream/mpi/UIPread.C b/src/Pstream/mpi/UIPread.C index fb6a9ec7d7b45930a594280a75bc0707194654e4..9a70f456b9da3e10b5a9229da3cb7a922610932b 100644 --- a/src/Pstream/mpi/UIPread.C +++ b/src/Pstream/mpi/UIPread.C @@ -40,6 +40,7 @@ Foam::UIPstream::UIPstream const commsTypes commsType, const int fromProcNo, DynamicList<char>& externalBuf, + label& externalBufPosition, const int tag, streamFormat format, versionNumber version @@ -49,7 +50,7 @@ Foam::UIPstream::UIPstream Istream(format, version), fromProcNo_(fromProcNo), externalBuf_(externalBuf), - externalBufPosition_(0), + externalBufPosition_(externalBufPosition), tag_(tag), messageSize_(0) { @@ -122,7 +123,7 @@ Foam::UIPstream::UIPstream(const int fromProcNo, PstreamBuffers& buffers) Istream(buffers.format_, buffers.version_), fromProcNo_(fromProcNo), externalBuf_(buffers.recvBuf_[fromProcNo]), - externalBufPosition_(0), + externalBufPosition_(buffers.recvBufPos_[fromProcNo]), tag_(buffers.tag_), messageSize_(0) { diff --git a/src/Pstream/mpi/UOPwrite.C b/src/Pstream/mpi/UOPwrite.C index 9f8726d9a036d2e4af275f51bd4a20140bc7521d..8d272fc0ca5f3420b2a6c9e2a9d6c46d9dab8924 100644 --- a/src/Pstream/mpi/UOPwrite.C +++ b/src/Pstream/mpi/UOPwrite.C @@ -45,7 +45,7 @@ bool Foam::UOPstream::write { if (debug) { - Pout<< "UIPstream::write : starting write to:" << toProcNo + Pout<< "UOPstream::write : starting write to:" << toProcNo << " tag:" << tag << " size:" << label(bufSize) << " commsType:" << UPstream::commsTypeNames[commsType] << Foam::endl; @@ -67,7 +67,7 @@ bool Foam::UOPstream::write if (debug) { - Pout<< "UIPstream::write : finished write to:" << toProcNo + Pout<< "UOPstream::write : finished write to:" << toProcNo << " tag:" << tag << " size:" << label(bufSize) << " commsType:" << UPstream::commsTypeNames[commsType] << Foam::endl; @@ -87,7 +87,7 @@ bool Foam::UOPstream::write if (debug) { - Pout<< "UIPstream::write : finished write to:" << toProcNo + Pout<< "UOPstream::write : finished write to:" << toProcNo << " tag:" << tag << " size:" << label(bufSize) << " commsType:" << UPstream::commsTypeNames[commsType] << Foam::endl; @@ -110,7 +110,7 @@ bool Foam::UOPstream::write if (debug) { - Pout<< "UIPstream::write : started write to:" << toProcNo + Pout<< "UOPstream::write : started write to:" << toProcNo << " tag:" << tag << " size:" << label(bufSize) << " commsType:" << UPstream::commsTypeNames[commsType] << " request:" << PstreamGlobals::outstandingRequests_.size()