From e4b4bf2bf09ca65209e16f47e33a6df48798fe99 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 4 Mar 2010 15:03:10 +0000 Subject: [PATCH] ENH: UIPstream when reaches eof deletes the underlying buffer. Only in PstreamBuffers mode. This makes sure that data from other processors already handled gets deleted. --- src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C | 12 +++++++++++- src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C | 15 +++++++++++++++ src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H | 8 ++++++++ src/Pstream/dummy/UIPread.C | 3 +++ src/Pstream/mpi/UIPread.C | 3 +++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C index 8842768098..087028c3d2 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/IPstream.C @@ -38,7 +38,17 @@ Foam::IPstream::IPstream ) : Pstream(commsType, bufSize), - UIPstream(commsType, fromProcNo, buf_, externalBufPosition_), + UIPstream + ( + commsType, + fromProcNo, + buf_, + externalBufPosition_, + UPstream::msgType(), // tag + false, // do not clear buf_ if at end + format, + version + ), externalBufPosition_(0) {} diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C index f4c37633f3..b644942c73 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C @@ -77,6 +77,21 @@ inline void Foam::UIPstream::readFromBuffer } +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::UIPstream::~UIPstream() +{ + if (clearAtEnd_ && eof()) + { + if (debug) + { + Pout<< "UIPstream::~UIPstream() : clearing externalBuf_ of size " + << externalBuf_.size() << endl; + } + externalBuf_.clearStorage(); + } +} + // * * * * * * * * * * * * * * 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 30e4e96119..b4f084baed 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H @@ -67,6 +67,8 @@ class UIPstream const int tag_; + const bool clearAtEnd_; + label messageSize_; @@ -96,6 +98,7 @@ public: DynamicList& externalBuf, label& externalBufPosition, const int tag = UPstream::msgType(), + const bool clearAtEnd = false, // destroy externalBuf if at end streamFormat format=BINARY, versionNumber version=currentVersion ); @@ -104,6 +107,11 @@ 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 da9613af37..c21a7e77b5 100644 --- a/src/Pstream/dummy/UIPread.C +++ b/src/Pstream/dummy/UIPread.C @@ -38,6 +38,7 @@ Foam::UIPstream::UIPstream DynamicList& externalBuf, label& externalBufPosition, const int tag, + const bool clearAtEnd, streamFormat format, versionNumber version ) @@ -48,6 +49,7 @@ Foam::UIPstream::UIPstream externalBuf_(externalBuf), externalBufPosition_(externalBufPosition), tag_(tag), + clearAtEnd_(clearAtEnd), messageSize_(0) { notImplemented @@ -59,6 +61,7 @@ Foam::UIPstream::UIPstream "DynamicList&," "label&," "const int tag," + "const bool," "streamFormat, versionNumber" ")" ); diff --git a/src/Pstream/mpi/UIPread.C b/src/Pstream/mpi/UIPread.C index 9a70f456b9..28c3fe3e55 100644 --- a/src/Pstream/mpi/UIPread.C +++ b/src/Pstream/mpi/UIPread.C @@ -42,6 +42,7 @@ Foam::UIPstream::UIPstream DynamicList& externalBuf, label& externalBufPosition, const int tag, + const bool clearAtEnd, streamFormat format, versionNumber version ) @@ -52,6 +53,7 @@ Foam::UIPstream::UIPstream externalBuf_(externalBuf), externalBufPosition_(externalBufPosition), tag_(tag), + clearAtEnd_(clearAtEnd), messageSize_(0) { setOpened(); @@ -125,6 +127,7 @@ Foam::UIPstream::UIPstream(const int fromProcNo, PstreamBuffers& buffers) externalBuf_(buffers.recvBuf_[fromProcNo]), externalBufPosition_(buffers.recvBufPos_[fromProcNo]), tag_(buffers.tag_), + clearAtEnd_(true), messageSize_(0) { if (commsType() != UPstream::scheduled && !buffers.finishedSendsCalled_)