source: XIOS3/trunk/src/cxios.cpp @ 2420

Last change on this file since 2420 was 2420, checked in by jderouillat, 19 months ago

Add an option (log_memory : set to false by default), to activate memory monitoring. Logs are now buffered.

  • 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.0 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::defaultWriterId="default_writer_id" ;
29  const string CXios::defaultReaderId="default_reader_id" ;
30  const string CXios::defaultGathererId="default_gatherer_id" ;
31  const string CXios::defaultServicesId="default_services_id" ;
32 
33  bool CXios::xiosStack = true;
34  bool CXios::systemStack = false;
35
36  bool CXios::isClient ;
37  bool CXios::isServer ;
38 
39  MPI_Comm CXios::globalComm ;
40  MPI_Comm CXios::xiosComm ;
41
42  bool CXios::usingOasis ;
43  bool CXios::usingServer = false;
44  bool CXios::usingServer2 = false;
45  int CXios::ratioServer2 = 50;
46  int CXios::nbPoolsServer2 = 1;
47  double CXios::bufferSizeFactor = 1.0;
48  const double CXios::defaultBufferSizeFactor = 1.0;
49  StdSize CXios::minBufferSize = 64 * sizeof(double);
50  StdSize CXios::maxBufferSize = std::numeric_limits<int>::max() ;
51  bool CXios::printLogs2Files;
52  bool CXios::isOptPerformance = true;
53  CRegistry* CXios::globalRegistry = 0;
54  double CXios::recvFieldTimeout = 300.0;
55  bool CXios::checkEventSync=false ;
56  bool CXios::checkSumRecv=false ;
57  bool CXios::checkSumSend=false ;
58  bool CXios::logMemory=false ;
59
60  CDaemonsManager*    CXios::daemonsManager_=nullptr ;
61  CRessourcesManager* CXios::ressourcesManager_=nullptr ;
62  CServicesManager*   CXios::servicesManager_=nullptr ;
63  CContextsManager*   CXios::contextsManager_=nullptr ;
64  CCouplerManager*    CXios::couplerManager_=nullptr ;
65  CRegistryManager*   CXios::registryManager_=nullptr ;
66
67  CMpiGarbageCollector CXios::MpiGarbageCollector_  ;
68
69  //! Parse configuration file and create some objects from it
70  void CXios::initialize()
71  {
72    set_new_handler(noMemory);
73    parseFile(rootFile);
74    parseXiosConfig();
75  }
76
77  /*!
78  \brief Parse xios part of configuration file (.iodef.xml)
79   Both client and server need information returned from this function
80  */
81  void CXios::parseXiosConfig()
82  {
83    usingOasis=getin<bool>("using_oasis",false) ;
84    usingServer=getin<bool>("using_server",false) ;
85    usingServer2=getin<bool>("using_server2",false) ;
86    ratioServer2=getin<int>("ratio_server2",50);
87    nbPoolsServer2=getin<int>("number_pools_server2",0);
88    info.setLevel(getin<int>("info_level",0)) ;
89    report.setLevel(getin<int>("info_level",50));
90    printLogs2Files=getin<bool>("print_file",false);
91
92    xiosStack=getin<bool>("xios_stack",true) ;
93    systemStack=getin<bool>("system_stack",false) ;
94    if (xiosStack && systemStack)
95    {
96      xiosStack = false;
97    }
98
99    StdString bufMemory("memory");
100    StdString bufPerformance("performance");
101    StdString bufOpt = getin<StdString>("optimal_buffer_size", bufPerformance);
102    std::transform(bufOpt.begin(), bufOpt.end(), bufOpt.begin(), ::tolower);
103    if (0 == bufOpt.compare(bufMemory)) isOptPerformance = false;
104    else if (0 != bufOpt.compare(bufPerformance))
105    {
106      ERROR("CXios::parseXiosConfig()", << "optimal_buffer_size must be memory or performance "<< endl );
107    }
108
109    bufferSizeFactor = getin<double>("buffer_size_factor", defaultBufferSizeFactor);
110    minBufferSize = getin<int>("min_buffer_size", 1024 * sizeof(double));
111    maxBufferSize = getin<int>("max_buffer_size", std::numeric_limits<int>::max());
112    recvFieldTimeout = getin<double>("recv_field_timeout", recvFieldTimeout);
113    if (recvFieldTimeout < 0.0)
114      ERROR("CXios::parseXiosConfig()", "recv_field_timeout cannot be negative.");
115
116    checkEventSync = getin<bool>("check_event_sync", checkEventSync);
117   
118    checkSumSend = getin<bool>("checksum_send_fields", false);
119    checkSumRecv = getin<bool>("checksum_recv_fields", false);
120   
121    logMemory = getin<bool>("log_memory", false);
122
123    globalComm=MPI_COMM_WORLD ;
124  }
125
126  /*!
127  Initialize client
128  \param [in] codeId identity of context
129  \param [in] localComm local communicator
130  \param [in/out] returnComm communicator corresponding to group of client with same codeId
131  */
132  void CXios::initClientSide(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)
133  TRY
134  {
135    initialize() ;
136
137    isClient = true;
138
139    //CClient::initialize(codeId,localComm,returnComm) ;
140    CClient::initialize(codeId,localComm,returnComm) ;
141   
142    // If there are no server processes then we are in attached mode
143    // and the clients are also servers
144    isServer = !usingServer;
145
146    if (printLogs2Files)
147    {
148      CClient::openInfoStream(clientFile);
149      CClient::openErrorStream(clientFile);
150    }
151    else
152    {
153      CClient::openInfoStream();
154      CClient::openErrorStream();
155    }
156    CMemChecker::logMem("CXios::initClientSide");
157  }
158  CATCH
159
160  void CXios::clientFinalize(void)
161  {
162     CMemChecker::logMem("CXios::clientFinalize", true);
163
164     CClient::finalize() ;
165         
166#ifdef XIOS_MEMTRACK
167
168#ifdef XIOS_MEMTRACK_LIGHT
169       report(10) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
170       report(10) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
171#endif
172
173#ifdef XIOS_MEMTRACK_FULL
174      report(0) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
175      report(0) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
176     
177      ofstream memReport ;
178      std::filebuf* fb = memReport.rdbuf();
179      CClient::openStream(clientFile, ".mem", fb);
180     
181      MemTrack::TrackListMemoryUsage() ;
182      size_t memtrack_blocks=0 ;
183      memtrack_blocks=xios::CXios::getin("memtrack_blocks",memtrack_blocks) ;
184      size_t memtrack_size=0 ;
185      memtrack_size=xios::CXios::getin("memtrack_size",memtrack_size) ;
186      MemTrack::TrackDumpBlocks(memReport, memtrack_blocks,memtrack_size);
187      memReport.close();
188#endif
189
190     CClient::closeInfoStream();
191
192#endif
193  }
194
195  //! Init server by parsing only xios part of config file
196  void CXios::initServer()
197  {
198    set_new_handler(noMemory);
199    std::set<StdString> parseList;
200    parseList.insert("xios");
201    xml::CXMLParser::ParseFile(rootFile, parseList);
202    parseXiosConfig();
203  }
204
205  //! Initialize server then put it into listening state
206  void CXios::initServerSide(void)
207  {
208    CMemChecker::get("xios").resume() ;
209    initServer();
210    isClient = false;
211    isServer = true;
212
213    // Initialize all aspects MPI
214    CServer::initialize();
215    CServer::finalize();
216
217#ifdef XIOS_MEMTRACK
218
219#ifdef XIOS_MEMTRACK_LIGHT
220       report(10) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
221       report(10) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
222#endif
223
224#ifdef XIOS_MEMTRACK_FULL
225      report(0) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
226      report(0) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
227      ofstream memReport ;
228      std::filebuf* fb = memReport.rdbuf();
229      CClient::openStream(serverFile, ".mem", fb);
230     
231      MemTrack::TrackListMemoryUsage() ;
232      size_t memtrack_blocks=0 ;
233      memtrack_blocks=xios::CXios::getin("memtrack_blocks",memtrack_blocks) ;
234      size_t memtrack_size=0 ;
235      memtrack_size=xios::CXios::getin("memtrack_size",memtrack_size) ;
236      MemTrack::TrackDumpBlocks(memReport,memtrack_blocks,memtrack_size);
237      memReport.close() ;
238#endif
239#endif
240    CMemChecker::get("xios").suspend() ;
241    CServer::closeInfoStream();
242  }
243
244  //! Parse configuration file
245  void CXios::parseFile(const string& filename)
246  {
247    xml::CXMLParser::ParseFile(filename);
248  }
249
250  //! Set using server
251  void CXios::setUsingServer()
252  {
253    usingServer = true;
254  }
255
256  //! Unset using server
257  void CXios::setNotUsingServer()
258  {
259    usingServer = false;
260  }
261
262  void CXios::launchRegistryManager(bool isXiosServer)
263  {
264    registryManager_ = new CRegistryManager(isXiosServer) ;
265  }
266
267  void CXios::launchRessourcesManager(bool isXiosServer)
268  {
269    ressourcesManager_ = new CRessourcesManager(isXiosServer) ;
270  }
271
272  void CXios::launchCouplerManager(bool isXiosServer)
273  {
274    couplerManager_ = new CCouplerManager(isXiosServer) ;
275  }
276
277  void CXios::launchServicesManager(bool isXiosServer)
278  {
279    servicesManager_ = new CServicesManager(isXiosServer) ;
280  }
281
282  void CXios::launchContextsManager(bool isXiosServer)
283  {
284    contextsManager_ = new CContextsManager(isXiosServer) ;
285  }
286 
287  void CXios::launchDaemonsManager(bool isXiosServer)
288  {
289    daemonsManager_ = new CDaemonsManager(isXiosServer) ;
290  }
291
292 
293  void CXios::finalizeRegistryManager()
294  {
295    delete registryManager_;
296  }
297
298  void CXios::finalizeRessourcesManager()
299  {
300    delete ressourcesManager_;
301  }
302
303  void CXios::finalizeCouplerManager()
304  {
305    delete couplerManager_;
306  }
307
308  void CXios::finalizeServicesManager()
309  {
310    delete servicesManager_  ;
311  }
312
313  void CXios::finalizeContextsManager()
314  {
315    delete contextsManager_  ;
316  }
317 
318  void CXios::finalizeDaemonsManager()
319  {
320    delete daemonsManager_  ;
321  }
322 
323  CPoolRessource* CXios::getPoolRessource(void)
324  {
325    if (isClient) return CClient::getPoolRessource() ;
326    else if (isServer) return CServer::getServersRessource()->getPoolRessource() ;
327   
328    MISSING_RETURN( "CPoolRessource* CXios::getPoolRessource()" );
329    return nullptr;
330  }
331}
332
Note: See TracBrowser for help on using the repository browser.