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

Last change on this file since 2407 was 2407, checked in by ymipsl, 22 months ago

Implement separate "reader" and "writer" service. Default reader live on same ressources that "writer" or "gatherer" services.

YM

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