Bug fix supplied by Niklas Nordin:
[OpenFOAM-1.5.x.git] / src / Pstream / pvm / IPread.C
blobd4aca45ae9a09b769454fea75ac8423f3658638f
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software; you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation; either version 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 Description
26     Read token and binary block from IPstream using pvm.
28 \*---------------------------------------------------------------------------*/
30 #include "error.H"
32 #include "IPstream.H"
34 #include <pvm3.h>
36 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
38 namespace Foam
41 // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
43 IPstream::IPstream
45     const int fromProcNo,
46     const label bufSize,
47     streamFormat format,
48     versionNumber version
51     Pstream(bufSize),
52     Istream(format, version),
53     fromProcNo_(fromProcNo),
54     messageSize_(0)
56     setOpened();
57     setGood();
59     int bufid, tag, tid;
61     // If the buffer size is not specified then probe the incomming message
63     if (!bufSize)
64     {
65         // Probe read buffer until message arrives.
66         while (!(bufid = pvm_probe(procID(fromProcNo_), msgType())));
68         // When the message arrives find its size
69         pvm_bufinfo(bufid, &messageSize_, &tag, &tid);
71         // Resize buffer to message size
72         buf_.setSize(messageSize_);
73     }
76     // Read message into buffer
78     if
79     (
80         pvm_precv
81         (
82             procID(fromProcNo_),
83             msgType(),
84             buf_.begin(),
85             buf_.size(),
86             PVM_BYTE,
87             &tid, &tag, &messageSize_
88         ) != PvmOk
89     )
90     {
91         FatalErrorIn("IPstream::IPstream(const int fromProcNo)")
92             << "pvm_precv cannot receive incomming message"
93             << ::abort;
94     }
97     // Check size of message read
99     if (messageSize_ > buf_.size())
100     {
101         FatalErrorIn("IPstream::IPstream(const int fromProcNo)")
102             << "buffer (" << buf_.size()
103             << ") not large enough for incomming message ("
104             << messageSize_ << ')'
105             << ::abort;
106     }
110 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
112 } // End namespace Foam
114 // ************************************************************************* //