source: XIOS/trunk/src/node/context.hpp @ 639

Last change on this file since 639 was 639, checked in by rlacroix, 9 years ago

Add a basic garbage collector to ensure no packets linger in the filter graph.

  • 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
File size: 7.8 KB
Line 
1#ifndef __XIOS_CContext__
2#define __XIOS_CContext__
3
4/// XIOS headers ///
5#include "xios_spl.hpp"
6//#include "node_type.hpp"
7#include "calendar_wrapper.hpp"
8
9#include "declare_group.hpp"
10//#include "context_client.hpp"
11//#include "context_server.hpp"
12#include "data_output.hpp"
13#include "garbage_collector.hpp"
14
15#include "mpi.hpp"
16
17
18namespace xios {
19   class CContextClient;
20   class CContextServer;
21
22
23   /// ////////////////////// Déclarations ////////////////////// ///
24   class CContextGroup;
25   class CContextAttributes;
26   class CContext;
27   class CFile;
28   ///--------------------------------------------------------------
29
30   // Declare/Define CFileAttribute
31   BEGIN_DECLARE_ATTRIBUTE_MAP(CContext)
32#  include "context_attribute.conf"
33   END_DECLARE_ATTRIBUTE_MAP(CContext)
34
35   ///--------------------------------------------------------------
36  /*!
37  \class CContext
38   This class corresponds to the concrete presentation of context in xml file and in play an essential role in XIOS
39   Each object of this class contains all root definition of elements: files, fiels, domains, axis, etc, ... from which
40   we can have access to each element.
41   In fact, every thing must a be inside a particuliar context. After the xml file (iodef.xml) is parsed,
42   object of the class is created and its contains all information of other elements in the xml file.
43  */
44   class CContext
45      : public CObjectTemplate<CContext>
46      , public CContextAttributes
47   {
48         public :
49         enum EEventId
50         {
51           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
52           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
53           EVENT_ID_POST_PROCESS
54         };
55
56         /// typedef ///
57         typedef CObjectTemplate<CContext>   SuperClass;
58         typedef CContextAttributes SuperClassAttribute;
59
60      public :
61
62         typedef CContextAttributes RelAttributes;
63         typedef CContext           RelGroup;
64
65         //---------------------------------------------------------
66
67      public :
68
69         /// Constructeurs ///
70         CContext(void);
71         explicit CContext(const StdString & id);
72         CContext(const CContext & context);       // Not implemented yet.
73         CContext(const CContext * const context); // Not implemented yet.
74
75         /// Destructeur ///
76         virtual ~CContext(void);
77
78         //---------------------------------------------------------
79
80      public :
81
82         /// Mutateurs ///
83         void setCalendar(boost::shared_ptr<CCalendar> newCalendar);
84
85         /// Accesseurs ///
86         boost::shared_ptr<CCalendar>      getCalendar(void) const;
87
88      public :
89         // Initialize server or client
90         void initServer(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtClient = 0);
91         void initClient(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtServer = 0);
92         bool isInitialized(void);
93
94         // Put sever or client into loop state
95         bool eventLoop(void);
96
97         bool checkBuffersAndListen(void);
98
99         // Finalize a context
100         void finalize(void);
101         void closeDefinition(void);
102
103         // Some functions to process context
104         void findAllEnabledFields(void);
105         void processEnabledFiles(void);
106         void solveAllInheritance(bool apply=true);
107         void findEnabledFiles(void);
108         void findEnabledReadModeFiles(void);
109         void closeAllFile(void);
110         void updateCalendar(int step);
111         void createFileHeader(void );
112         void solveAllRefOfEnabledFields(bool sendToServer);
113         void buildAllExpressionOfEnabledFields();
114         void startPrefetchingOfEnabledReadModeFiles();
115         void checkPrefetchingOfEnabledReadModeFiles();
116         void findFieldsWithReadAccess(void);
117         void solveAllRefOfFieldsWithReadAccess();
118         void buildAllExpressionOfFieldsWithReadAccess();
119         void postProcessing();
120
121         std::map<int, StdSize>& getDataSize();
122         void setClientServerBuffer();
123
124         // Send context close definition
125         void sendCloseDefinition(void);
126         // There are something to send on closing context defintion
127         void sendUpdateCalendar(int step);
128         void sendCreateFileHeader(void);
129         void sendEnabledFiles();
130         void sendEnabledFields();
131         void sendRefDomainsAxis();
132         void sendRefGrid();
133         void sendPostProcessing();
134
135         const StdString& getIdServer();
136
137         // Client side: Receive and process messages
138         static void recvUpdateCalendar(CEventServer& event);
139         void recvUpdateCalendar(CBufferIn& buffer);
140         static void recvCloseDefinition(CEventServer& event);
141         static void recvCreateFileHeader(CEventServer& event);
142         void recvCreateFileHeader(CBufferIn& buffer);
143         static void recvSolveInheritanceContext(CEventServer& event);
144         void recvSolveInheritanceContext(CBufferIn& buffer);
145         static void recvPostProcessing(CEventServer& event);
146         void recvPostProcessing(CBufferIn& buffer);
147
148         // dispatch event
149         static bool dispatchEvent(CEventServer& event);
150
151      public:
152        // Get current context
153        static CContext* getCurrent(void);
154
155        // Get context root
156        static CContextGroup* getRoot(void);
157
158        // Set current context
159        static void setCurrent(const string& id);
160
161        // Create new context
162        static CContext* create(const string& id = "");
163
164        /// Accesseurs statiques ///
165        static StdString GetName(void);
166        static StdString GetDefName(void);
167        static ENodeType GetType(void);
168
169        static CContextGroup* GetContextGroup(void);
170
171        // Some functions to visualize structure of current context
172        static void ShowTree(StdOStream & out = std::clog);
173        static void CleanTree(void);
174
175      public :
176         // Parse xml node and write all info into context
177         virtual void parse(xml::CXMLNode & node);
178
179         // Visualize a context
180         virtual StdString toString(void) const;
181
182
183         // Solve all inheritance relation in current context
184         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
185
186         // Verify if all root definition in a context have children
187         virtual bool hasChild(void) const;
188
189      public :
190         // Calendar of context
191         boost::shared_ptr<CCalendar>   calendar;
192
193         // List of all enabled files (files on which fields are written or read)
194         std::vector<CFile*> enabledFiles;
195         // List of all enabled files in read mode (files on which fields are read)
196         std::vector<CFile*> enabledReadModeFiles;
197
198         // List of all fields whose instant data is accessible from the public API
199         std::vector<CField*> fieldsWithReadAccess;
200
201         // Context root
202         static shared_ptr<CContextGroup> root;
203
204         // Determine context on client or not
205         bool hasClient;
206
207         // Determine context on server or not
208         bool hasServer;
209
210         // Concrete context server
211         CContextServer* server;
212
213         // Concrete contex client
214         CContextClient* client;
215
216      private:
217         bool isPostProcessed;
218         bool finalized;
219         std::map<int, StdSize> dataSize_;
220         StdString idServer_;
221         CGarbageCollector garbageCollector;
222
223
224      public: // Some function maybe removed in the near future
225        // virtual void toBinary  (StdOStream & os) const;
226        // virtual void fromBinary(StdIStream & is);
227        // void solveAllGridRef(void);
228        // void solveAllOperation(void);
229        // void solveAllExpression(void);
230        // void solveFieldRefInheritance(bool apply);
231
232   }; // class CContext
233
234   ///--------------------------------------------------------------
235
236   // Declare/Define CContextGroup and CContextDefinition
237   DECLARE_GROUP(CContext);
238
239   ///--------------------------------------------------------------
240
241} // namespace xios
242
243#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.