ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / src / Pstream / gamma / IPread.C
blobcf0915ec0e65f064d60f9abb49366492c9f24a13
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
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
13     the Free Software Foundation, either version 3 of the License, or
14     (at your 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, see <http://www.gnu.org/licenses/>.
24 Description
25     Read token and binary block from IPstream
27 \*---------------------------------------------------------------------------*/
29 #include "IPstream.H"
30 #include "long.H"
31 #include "PstreamGlobals.H"
33 extern "C"
35 #   include <linux/gamma/libgamma.h>
38 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40 namespace Foam
43 // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
45 IPstream::IPstream
47     const commsTypes commsType,
48     const int fromProcNo,
49     const label bufSize,
50     streamFormat format,
51     versionNumber version
54     Pstream(commsType, bufSize),
55     Istream(format, version),
56     fromProcNo_(fromProcNo),
57     messageSize_(0)
59     // Blocking read.
61     setOpened();
62     setGood();
64     if (Pstream::debug)
65     {
66         Pout<< "IPstream::IPstream : Starting receive from " << fromProcNo_
67             << " recvIndex:" << PstreamGlobals::recvIndex[fromProcNo_]
68             << Foam::endl;
69     }
71     PstreamGlobals::gammaWait(fromProcNo_);
73     label ready = PstreamGlobals::consumeIndex[fromProcNo_];
74     messageSize_ = PstreamGlobals::recvBufLen[ready][fromProcNo_];
76     if (!bufSize)
77     {
78         if (Pstream::debug)
79         {
80             Pout<< "IPstream::IPstream : sizing buffer to " << messageSize_
81                 << endl;
82         }
84         buf_.setSize(messageSize_);
85     }
87     PstreamGlobals::copyReceive(fromProcNo_, buf_.begin(), buf_.size());
89     if (Pstream::debug)
90     {
91         Pout<< "IPstream::IPstream : Received " << messageSize_
92             << " from " << fromProcNo_
93             << Foam::endl;
94     }
98 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
100 label IPstream::read
102     const commsTypes commsType,
103     const int fromProcNo,
104     char* buf,
105     const std::streamsize bufSize
108     // Blocking read.
109     label messageSize;
111     if (Pstream::debug)
112     {
113         Pout<< "IPstream::read : Starting receive from " << fromProcNo
114             << " recvIndex:" << PstreamGlobals::recvIndex[fromProcNo]
115             << Foam::endl;
116     }
118     PstreamGlobals::gammaWait(fromProcNo);
119     messageSize = PstreamGlobals::copyReceive(fromProcNo, buf, bufSize);
121     if (Pstream::debug)
122     {
123         Pout<< "IPstream::read : Received " << messageSize
124             << " from " << fromProcNo
125             << Foam::endl;
126     }
128     return messageSize;
132 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
134 } // End namespace Foam
136 // ************************************************************************* //