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

Last change on this file since 2407 was 2407, checked in by ymipsl, 21 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
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
59  CDaemonsManager*    CXios::daemonsManager_=nullptr ;
60  CRessourcesManager* CXios::ressourcesManager_=nullptr ;
61  CServicesManager*   CXios::servicesManager_=nullptr ;
62  CContextsManager*   CXios::contextsManager_=nullptr ;
63  CCouplerManager*    CXios::couplerManager_=nullptr ;
64  CRegistryManager*   CXios::registryManager_=nullptr ;
65
66  CMpiGarbageCollector CXios::MpiGarbageCollector_  ;
67
68  //! Parse configuration file and create some objects from it
69  void CXios::initialize()
70  {
71    set_new_handler(noMemory);
72    parseFile(rootFile);
73    parseXiosConfig();
74  }
75
76  /*!
77  \brief Parse xios part of configuration file (.iodef.xml)
78   Both client and server need information returned from this function
79  */
80  void CXios::parseXiosConfig()
81  {
82    usingOasis=getin<bool>("using_oasis",false) ;
83    usingServer=getin<bool>("using_server",false) ;
84    usingServer2=getin<bool>("using_server2",false) ;
85    ratioServer2=getin<int>("ratio_server2",50);
86    nbPoolsServer2=getin<int>("number_pools_server2",0);
87    info.setLevel(getin<int>("info_level",0)) ;
88    report.setLevel(getin<int>("info_level",50));
89    printLogs2Files=getin<bool>("print_file",false);
90
91    xiosStack=getin<bool>("xios_stack",true) ;
92    systemStack=getin<bool>("system_stack",false) ;
93    if (xiosStack && systemStack)
94    {
95      xiosStack = false;
96    }
97
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
108    bufferSizeFactor = getin<double>("buffer_size_factor", defaultBufferSizeFactor);
109    minBufferSize = getin<int>("min_buffer_size", 1024 * sizeof(double));
110    maxBufferSize = getin<int>("max_buffer_size", std::numeric_limits<int>::max());
111    recvFieldTimeout = getin<double>("recv_field_timeout", recvFieldTimeout);
112    if (recvFieldTimeout < 0.0)
113      ERROR("CXios::parseXiosConfig()", "recv_field_timeout cannot be negative.");
114
115    checkEventSync = getin<bool>("check_event_sync", checkEventSync);
116   
117    checkSumSend = getin<bool>("checksum_send_fields", false);
118    checkSumRecv = getin<bool>("checksum_recv_fields", false);
119
120    globalComm=MPI_COMM_WORLD ;
121  }
122
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  */
129  void CXios::initClientSide(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)
130  TRY
131  {
132    initialize() ;
133
134    isClient = true;
135
136    //CClient::initialize(codeId,localComm,returnComm) ;
137    CClient::initialize(codeId,localComm,returnComm) ;
138   
139    // If there are no server processes then we are in attached mode
140    // and the clients are also servers
141    isServer = !usingServer;
142
143    if (printLogs2Files)
144    {
145      CClient::openInfoStream(clientFile);
146      CClient::openErrorStream(clientFile);
147    }
148    else
149    {
150      CClient::openInfoStream();
151      CClient::openErrorStream();
152    }
153  }
154  CATCH
155
156  void CXios::clientFinalize(void)
157  {
158     CClient::finalize() ;
159         
160#ifdef XIOS_MEMTRACK
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
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();
182#endif
183
184     CClient::closeInfoStream();
185
186#endif
187  }
188
189  //! Init server by parsing only xios part of config file
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);
196    parseXiosConfig();
197  }
198
199  //! Initialize server then put it into listening state
200  void CXios::initServerSide(void)
201  {
202    CMemChecker::get("xios").resume() ;
203    initServer();
204    isClient = false;
205    isServer = true;
206
207    // Initialize all aspects MPI
208    CServer::initialize();
209    CServer::finalize();
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
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() ;
232#endif
233#endif
234    CMemChecker::get("xios").suspend() ;
235    report(0)<<CMemChecker::getAllCumulatedMem() ;
236    CServer::closeInfoStream();
237  }
238
239  //! Parse configuration file
240  void CXios::parseFile(const string& filename)
241  {
242    xml::CXMLParser::ParseFile(filename);
243  }
244
245  //! Set using server
246  void CXios::setUsingServer()
247  {
248    usingServer = true;
249  }
250
251  //! Unset using server
252  void CXios::setNotUsingServer()
253  {
254    usingServer = false;
255  }
256
257  void CXios::launchRegistryManager(bool isXiosServer)
258  {
259    registryManager_ = new CRegistryManager(isXiosServer) ;
260  }
261
262  void CXios::launchRessourcesManager(bool isXiosServer)
263  {
264    ressourcesManager_ = new CRessourcesManager(isXiosServer) ;
265  }
266
267  void CXios::launchCouplerManager(bool isXiosServer)
268  {
269    couplerManager_ = new CCouplerManager(isXiosServer) ;
270  }
271
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
287 
288  void CXios::finalizeRegistryManager()
289  {
290    delete registryManager_;
291  }
292
293  void CXios::finalizeRessourcesManager()
294  {
295    delete ressourcesManager_;
296  }
297
298  void CXios::finalizeCouplerManager()
299  {
300    delete couplerManager_;
301  }
302
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 
318  CPoolRessource* CXios::getPoolRessource(void)
319  {
320    if (isClient) return CClient::getPoolRessource() ;
321    else if (isServer) return CServer::getServersRessource()->getPoolRessource() ;
322   
323    MISSING_RETURN( "CPoolRessource* CXios::getPoolRessource()" );
324    return nullptr;
325  }
326}
327
Note: See TracBrowser for help on using the repository browser.