source: XIOS/dev/dev_ym/XIOS_COUPLING/src/cxios.cpp @ 2243

Last change on this file since 2243 was 2243, checked in by jderouillat, 2 years ago

Move context cleaning in xios_finalize (for clients) and when servers have finished their work

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
  • Property svn:eol-style set to native
File size: 9.3 KB
Line 
1
2#include "xios_spl.hpp"
3#include "cxios.hpp"
4#include "client.hpp"
5#include "server.hpp"
6#include "xml_parser.hpp"
7#include <boost/functional/hash.hpp>
8#include "mpi.hpp"
9#include "memory.hpp"
10#include <new>
11#include "memtrack.hpp"
12#include "registry.hpp"
13#include "ressources_manager.hpp"
14#include "services_manager.hpp"
15#include "servers_ressource.hpp"
16#include "mem_checker.hpp"
17
18namespace xios
19{
20  string CXios::rootFile="./iodef.xml" ;
21  string CXios::xiosCodeId="xios.x" ;
22  string CXios::clientFile="./xios_client";
23  string CXios::serverFile="./xios_server";
24  string CXios::serverPrmFile="./xios_server1";
25  string CXios::serverSndFile="./xios_server2";
26  const string CXios::defaultPoolId="default_pool_id" ;
27  const string CXios::defaultServerId="default_server_id" ;
28  const string CXios::defaultGathererId="default_gatherer_id" ;
29 
30  bool CXios::xiosStack = true;
31  bool CXios::systemStack = false;
32
33  bool CXios::isClient ;
34  bool CXios::isServer ;
35 
36  MPI_Comm CXios::globalComm ;
37  MPI_Comm CXios::xiosComm ;
38
39  bool CXios::usingOasis ;
40  bool CXios::usingServer = false;
41  bool CXios::usingServer2 = false;
42  int CXios::ratioServer2 = 50;
43  int CXios::nbPoolsServer2 = 1;
44  double CXios::bufferSizeFactor = 1.0;
45  const double CXios::defaultBufferSizeFactor = 1.0;
46  StdSize CXios::minBufferSize = 64 * sizeof(double);
47  StdSize CXios::maxBufferSize = std::numeric_limits<int>::max() ;
48  bool CXios::printLogs2Files;
49  bool CXios::isOptPerformance = true;
50  CRegistry* CXios::globalRegistry = 0;
51  double CXios::recvFieldTimeout = 300.0;
52  bool CXios::checkEventSync=false ;
53
54  CDaemonsManager*    CXios::daemonsManager_=nullptr ;
55  CRessourcesManager* CXios::ressourcesManager_=nullptr ;
56  CServicesManager*   CXios::servicesManager_=nullptr ;
57  CContextsManager*   CXios::contextsManager_=nullptr ;
58  CCouplerManager*    CXios::couplerManager_=nullptr ;
59  CRegistryManager*   CXios::registryManager_=nullptr ;
60
61  //! Parse configuration file and create some objects from it
62  void CXios::initialize()
63  {
64    set_new_handler(noMemory);
65    parseFile(rootFile);
66    parseXiosConfig();
67  }
68
69  /*!
70  \brief Parse xios part of configuration file (.iodef.xml)
71   Both client and server need information returned from this function
72  */
73  void CXios::parseXiosConfig()
74  {
75    usingOasis=getin<bool>("using_oasis",false) ;
76    usingServer=getin<bool>("using_server",false) ;
77    usingServer2=getin<bool>("using_server2",false) ;
78    ratioServer2=getin<int>("ratio_server2",50);
79    nbPoolsServer2=getin<int>("number_pools_server2",0);
80    info.setLevel(getin<int>("info_level",0)) ;
81    report.setLevel(getin<int>("info_level",50));
82    printLogs2Files=getin<bool>("print_file",false);
83
84    xiosStack=getin<bool>("xios_stack",true) ;
85    systemStack=getin<bool>("system_stack",false) ;
86    if (xiosStack && systemStack)
87    {
88      xiosStack = false;
89    }
90
91    StdString bufMemory("memory");
92    StdString bufPerformance("performance");
93    StdString bufOpt = getin<StdString>("optimal_buffer_size", bufPerformance);
94    std::transform(bufOpt.begin(), bufOpt.end(), bufOpt.begin(), ::tolower);
95    if (0 == bufOpt.compare(bufMemory)) isOptPerformance = false;
96    else if (0 != bufOpt.compare(bufPerformance))
97    {
98      ERROR("CXios::parseXiosConfig()", << "optimal_buffer_size must be memory or performance "<< endl );
99    }
100
101    bufferSizeFactor = getin<double>("buffer_size_factor", defaultBufferSizeFactor);
102    minBufferSize = getin<int>("min_buffer_size", 1024 * sizeof(double));
103    maxBufferSize = getin<int>("max_buffer_size", std::numeric_limits<int>::max());
104    recvFieldTimeout = getin<double>("recv_field_timeout", recvFieldTimeout);
105    if (recvFieldTimeout < 0.0)
106      ERROR("CXios::parseXiosConfig()", "recv_field_timeout cannot be negative.");
107
108    checkEventSync = getin<bool>("check_event_sync", checkEventSync);
109
110    globalComm=MPI_COMM_WORLD ;
111  }
112
113  /*!
114  Initialize client
115  \param [in] codeId identity of context
116  \param [in] localComm local communicator
117  \param [in/out] returnComm communicator corresponding to group of client with same codeId
118  */
119  void CXios::initClientSide(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)
120  TRY
121  {
122    initialize() ;
123
124    isClient = true;
125
126    //CClient::initialize(codeId,localComm,returnComm) ;
127    CClient::initialize(codeId,localComm,returnComm) ;
128   
129    // If there are no server processes then we are in attached mode
130    // and the clients are also servers
131    isServer = !usingServer;
132
133    if (printLogs2Files)
134    {
135      CClient::openInfoStream(clientFile);
136      CClient::openErrorStream(clientFile);
137    }
138    else
139    {
140      CClient::openInfoStream();
141      CClient::openErrorStream();
142    }
143  }
144  CATCH
145
146  void CXios::clientFinalize(void)
147  {
148     CClient::finalize() ;
149         
150#ifdef XIOS_MEMTRACK
151
152#ifdef XIOS_MEMTRACK_LIGHT
153       report(10) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
154       report(10) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
155#endif
156
157#ifdef XIOS_MEMTRACK_FULL
158      report(0) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
159      report(0) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
160     
161      ofstream memReport ;
162      std::filebuf* fb = memReport.rdbuf();
163      CClient::openStream(clientFile, ".mem", fb);
164     
165      MemTrack::TrackListMemoryUsage() ;
166      size_t memtrack_blocks=0 ;
167      memtrack_blocks=xios::CXios::getin("memtrack_blocks",memtrack_blocks) ;
168      size_t memtrack_size=0 ;
169      memtrack_size=xios::CXios::getin("memtrack_size",memtrack_size) ;
170      MemTrack::TrackDumpBlocks(memReport, memtrack_blocks,memtrack_size);
171      memReport.close();
172#endif
173
174     CClient::closeInfoStream();
175
176#endif
177  }
178
179  //! Init server by parsing only xios part of config file
180  void CXios::initServer()
181  {
182    set_new_handler(noMemory);
183    std::set<StdString> parseList;
184    parseList.insert("xios");
185    xml::CXMLParser::ParseFile(rootFile, parseList);
186    parseXiosConfig();
187  }
188
189  //! Initialize server then put it into listening state
190  void CXios::initServerSide(void)
191  {
192    CMemChecker::get("xios").resume() ;
193    initServer();
194    isClient = false;
195    isServer = true;
196
197    // Initialize all aspects MPI
198    CServer::initialize();
199    CServer::finalize();
200
201#ifdef XIOS_MEMTRACK
202
203#ifdef XIOS_MEMTRACK_LIGHT
204       report(10) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
205       report(10) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
206#endif
207
208#ifdef XIOS_MEMTRACK_FULL
209      report(0) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
210      report(0) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
211      ofstream memReport ;
212      std::filebuf* fb = memReport.rdbuf();
213      CClient::openStream(serverFile, ".mem", fb);
214     
215      MemTrack::TrackListMemoryUsage() ;
216      size_t memtrack_blocks=0 ;
217      memtrack_blocks=xios::CXios::getin("memtrack_blocks",memtrack_blocks) ;
218      size_t memtrack_size=0 ;
219      memtrack_size=xios::CXios::getin("memtrack_size",memtrack_size) ;
220      MemTrack::TrackDumpBlocks(memReport,memtrack_blocks,memtrack_size);
221      memReport.close() ;
222#endif
223#endif
224    CMemChecker::get("xios").suspend() ;
225    report(0)<<CMemChecker::getAllCumulatedMem() ;
226    CServer::closeInfoStream();
227  }
228
229  //! Parse configuration file
230  void CXios::parseFile(const string& filename)
231  {
232    xml::CXMLParser::ParseFile(filename);
233  }
234
235  //! Set using server
236  void CXios::setUsingServer()
237  {
238    usingServer = true;
239  }
240
241  //! Unset using server
242  void CXios::setNotUsingServer()
243  {
244    usingServer = false;
245  }
246
247  void CXios::launchRegistryManager(bool isXiosServer)
248  {
249    registryManager_ = new CRegistryManager(isXiosServer) ;
250  }
251
252  void CXios::launchRessourcesManager(bool isXiosServer)
253  {
254    ressourcesManager_ = new CRessourcesManager(isXiosServer) ;
255  }
256
257  void CXios::launchCouplerManager(bool isXiosServer)
258  {
259    couplerManager_ = new CCouplerManager(isXiosServer) ;
260  }
261
262  void CXios::launchServicesManager(bool isXiosServer)
263  {
264    servicesManager_ = new CServicesManager(isXiosServer) ;
265  }
266
267  void CXios::launchContextsManager(bool isXiosServer)
268  {
269    contextsManager_ = new CContextsManager(isXiosServer) ;
270  }
271 
272  void CXios::launchDaemonsManager(bool isXiosServer)
273  {
274    daemonsManager_ = new CDaemonsManager(isXiosServer) ;
275  }
276
277 
278  void CXios::finalizeRegistryManager()
279  {
280    delete registryManager_;
281  }
282
283  void CXios::finalizeRessourcesManager()
284  {
285    delete ressourcesManager_;
286  }
287
288  void CXios::finalizeCouplerManager()
289  {
290    delete couplerManager_;
291  }
292
293  void CXios::finalizeServicesManager()
294  {
295    delete servicesManager_  ;
296  }
297
298  void CXios::finalizeContextsManager()
299  {
300    delete contextsManager_  ;
301  }
302 
303  void CXios::finalizeDaemonsManager()
304  {
305    delete daemonsManager_  ;
306  }
307 
308
309  CPoolRessource* CXios::getPoolRessource(void)
310  {
311    if (isClient) return CClient::getPoolRessource() ;
312    else if (isServer) return CServer::getServersRessource()->getPoolRessource() ;
313  }
314}
315
Note: See TracBrowser for help on using the repository browser.