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

Last change on this file since 2241 was 2241, checked in by jderouillat, 3 years ago

Clean Context and it members before MPI_Finalize (to avoid some MPI call after MPI_Finalize, such as MPI_Free_mem in ServerBuffer? destructor)

  • 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: 10.8 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     // Delete CContext
179     xios_map<StdString, xios_map<StdString, std::shared_ptr<CContext> > >* contextMap = CObjectTemplate<CContext>::GetAllMapobject();
180     for(auto it = contextMap->begin(); it != contextMap->end(); ++it)
181     {
182       for(auto it2 = it->second.begin(); it2 != it->second.end(); ++it2)
183       {
184           std::shared_ptr<CContext> todel = it2->second;
185           todel.reset();
186       }
187       it->second.clear();
188
189       std::vector<std::shared_ptr<CContext> >*  contextVect = CObjectTemplate<CContext>::GetAllVectobjectPtr(it->first);
190       for(auto it = contextVect->begin(); it != contextVect->end(); ++it)
191       {
192           it->reset();
193       }
194       contextVect->clear();
195       
196     }
197     contextMap->clear();
198     
199  }
200
201  //! Init server by parsing only xios part of config file
202  void CXios::initServer()
203  {
204    set_new_handler(noMemory);
205    std::set<StdString> parseList;
206    parseList.insert("xios");
207    xml::CXMLParser::ParseFile(rootFile, parseList);
208    parseXiosConfig();
209  }
210
211  //! Initialize server then put it into listening state
212  void CXios::initServerSide(void)
213  {
214    CMemChecker::get("xios").resume() ;
215    initServer();
216    isClient = false;
217    isServer = true;
218
219    // Initialize all aspects MPI
220    CServer::initialize();
221    CServer::finalize();
222
223#ifdef XIOS_MEMTRACK
224
225#ifdef XIOS_MEMTRACK_LIGHT
226       report(10) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
227       report(10) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
228#endif
229
230#ifdef XIOS_MEMTRACK_FULL
231      report(0) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
232      report(0) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
233      ofstream memReport ;
234      std::filebuf* fb = memReport.rdbuf();
235      CClient::openStream(serverFile, ".mem", fb);
236     
237      MemTrack::TrackListMemoryUsage() ;
238      size_t memtrack_blocks=0 ;
239      memtrack_blocks=xios::CXios::getin("memtrack_blocks",memtrack_blocks) ;
240      size_t memtrack_size=0 ;
241      memtrack_size=xios::CXios::getin("memtrack_size",memtrack_size) ;
242      MemTrack::TrackDumpBlocks(memReport,memtrack_blocks,memtrack_size);
243      memReport.close() ;
244#endif
245#endif
246    CMemChecker::get("xios").suspend() ;
247    report(0)<<CMemChecker::getAllCumulatedMem() ;
248    CServer::closeInfoStream();
249   
250    // Delete CContext
251    xios_map<StdString, xios_map<StdString, std::shared_ptr<CContext> > >* contextMap = CObjectTemplate<CContext>::GetAllMapobject();
252    for(auto it = contextMap->begin(); it != contextMap->end(); ++it)
253    {
254      for(auto it2 = it->second.begin(); it2 != it->second.end(); ++it2)
255      {
256          std::shared_ptr<CContext> todel = it2->second;
257          todel.reset();
258      }
259      it->second.clear();
260
261      std::vector<std::shared_ptr<CContext> >*  contextVect = CObjectTemplate<CContext>::GetAllVectobjectPtr(it->first);
262      for(auto it = contextVect->begin(); it != contextVect->end(); ++it)
263      {
264          it->reset();
265      }
266      contextVect->clear();
267     
268    }
269    contextMap->clear();
270  }
271
272  //! Parse configuration file
273  void CXios::parseFile(const string& filename)
274  {
275    xml::CXMLParser::ParseFile(filename);
276  }
277
278  //! Set using server
279  void CXios::setUsingServer()
280  {
281    usingServer = true;
282  }
283
284  //! Unset using server
285  void CXios::setNotUsingServer()
286  {
287    usingServer = false;
288  }
289
290  void CXios::launchRegistryManager(bool isXiosServer)
291  {
292    registryManager_ = new CRegistryManager(isXiosServer) ;
293  }
294
295  void CXios::launchRessourcesManager(bool isXiosServer)
296  {
297    ressourcesManager_ = new CRessourcesManager(isXiosServer) ;
298  }
299
300  void CXios::launchCouplerManager(bool isXiosServer)
301  {
302    couplerManager_ = new CCouplerManager(isXiosServer) ;
303  }
304
305  void CXios::launchServicesManager(bool isXiosServer)
306  {
307    servicesManager_ = new CServicesManager(isXiosServer) ;
308  }
309
310  void CXios::launchContextsManager(bool isXiosServer)
311  {
312    contextsManager_ = new CContextsManager(isXiosServer) ;
313  }
314 
315  void CXios::launchDaemonsManager(bool isXiosServer)
316  {
317    daemonsManager_ = new CDaemonsManager(isXiosServer) ;
318  }
319
320 
321  void CXios::finalizeRegistryManager()
322  {
323    delete registryManager_;
324  }
325
326  void CXios::finalizeRessourcesManager()
327  {
328    delete ressourcesManager_;
329  }
330
331  void CXios::finalizeCouplerManager()
332  {
333    delete couplerManager_;
334  }
335
336  void CXios::finalizeServicesManager()
337  {
338    delete servicesManager_  ;
339  }
340
341  void CXios::finalizeContextsManager()
342  {
343    delete contextsManager_  ;
344  }
345 
346  void CXios::finalizeDaemonsManager()
347  {
348    delete daemonsManager_  ;
349  }
350 
351
352  CPoolRessource* CXios::getPoolRessource(void)
353  {
354    if (isClient) return CClient::getPoolRessource() ;
355    else if (isServer) return CServer::getServersRessource()->getPoolRessource() ;
356  }
357}
358
Note: See TracBrowser for help on using the repository browser.