Adding cfMesh-v1.0 into the repository
[foam-extend-3.2.git] / src / Pstream / gamma / IPread.C
blobc738012443f8673b5175f73486954087682095ed
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     |
5     \\  /    A nd           | For copyright notice see file Copyright
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend 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 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  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 // ************************************************************************* //