XIOS  1.0
Xml I/O Server
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Définitions de type Énumérations Valeurs énumérées Amis Macros
context_client.hpp
Aller à la documentation de ce fichier.
1 #ifndef __CONTEXT_CLIENT_HPP__
2 #define __CONTEXT_CLIENT_HPP__
3 
4 #include "xios_spl.hpp"
5 #include "buffer_out.hpp"
6 #include "buffer_in.hpp"
7 #include "buffer_client.hpp"
8 #include "event_client.hpp"
9 #include "event_server.hpp"
10 #include "mpi.hpp"
11 #include "registry.hpp"
12 
13 namespace xios
14 {
15  class CContext;
16 
26  {
27  public:
28  // Contructor
29  CContextClient(CContext* parent, MPI_Comm intraComm, MPI_Comm interComm, CContext* parentServer = 0);
30 
31  // Send event to server
32  void sendEvent(CEventClient& event);
34  void waitEvent(list<int>& ranks);
35 
36  // Functions to set/get buffers
37  bool getBuffers(const list<int>& serverList, const list<int>& sizeList, list<CBufferOut*>& retBuffers, bool nonBlocking = false);
38  void newBuffer(int rank);
39  bool checkBuffers(list<int>& ranks);
40  bool checkBuffers(void);
41  void releaseBuffers(void);
42  bool havePendingRequests(void);
43 
44  bool isServerLeader(void) const;
45  bool isServerNotLeader(void) const;
46  const std::list<int>& getRanksServerLeader(void) const;
47  const std::list<int>& getRanksServerNotLeader(void) const;
48 
49  bool isAttachedModeEnabled() const;
50  bool hasTemporarilyBufferedEvent() const { return !tmpBufferedEvent.isEmpty(); };
51 
52  static void computeLeader(int clientRank, int clientSize, int serverSize,
53  std::list<int>& rankRecvLeader,
54  std::list<int>& rankRecvNotLeader);
55 
56  // Close and finalize context client
57 // void closeContext(void); Never been implemented.
58  void finalize(void);
59 
60  void setBufferSize(const std::map<int,StdSize>& mapSize, const std::map<int,StdSize>& maxEventSize);
61 
62  public:
64 
65  size_t timeLine;
66 
67  int clientRank;
68 
69  int clientSize;
70 
71  int serverSize;
72 
73  MPI_Comm interComm;
74 
75  MPI_Comm intraComm;
76 
77  map<int,CClientBuffer*> buffers;
78 
79  private:
81  std::map<int,StdSize> mapBufferSize_;
83  std::map<int,StdSize> maxEventSizes;
86 
87  struct {
88  std::list<int> ranks, sizes;
89  std::list<CBufferOut*> buffers;
90 
91  bool isEmpty() const { return ranks.empty(); };
92  void clear() {
93  ranks.clear();
94  sizes.clear();
95 
96  for (std::list<CBufferOut*>::iterator it = buffers.begin(); it != buffers.end(); it++)
97  delete *it;
98 
99  buffers.clear();
100  };
101  } tmpBufferedEvent;
102 
105 
107  std::list<int> ranksServerLeader;
108 
110  std::list<int> ranksServerNotLeader;
111 
112  };
113 }
114 
115 #endif // __CONTEXT_CLIENT_HPP__
CContextClient(CContext *parent, MPI_Comm intraComm, MPI_Comm interComm, CContext *parentServer=0)
static void computeLeader(int clientRank, int clientSize, int serverSize, std::list< int > &rankRecvLeader, std::list< int > &rankRecvNotLeader)
void sendEvent(CEventClient &event)
In case of attached mode, the current context must be reset to context for client.
MPI_Comm intraComm
Communicator of client group.
void releaseBuffers(void)
Release all buffers.
int clientSize
Size of client group.
std::list< int > ranksServerNotLeader
List of server ranks for which the client is not leader.
CContext * parentServer
Event temporarily buffered (used only on the server)
void setBufferSize(const std::map< int, StdSize > &mapSize, const std::map< int, StdSize > &maxEventSize)
Set the buffer size for each connection.
const std::list< int > & getRanksServerNotLeader(void) const
Get leading server in the group of connected server.
size_t timeLine
Timeline of each event.
std::map< int, StdSize > mapBufferSize_
Mapping of server and buffer size for each connection to server.
bool checkBuffers(void)
Verify state of buffers.
bool isAttachedModeEnabled() const
Check if the attached mode is used.
const std::list< int > & getRanksServerLeader(void) const
Get leading server in the group of connected server.
#define xios(arg)
map< int, CClientBuffer * > buffers
Buffers for connection to servers.
bool getBuffers(const list< int > &serverList, const list< int > &sizeList, list< CBufferOut * > &retBuffers, bool nonBlocking=false)
Get buffers for each connection to the servers.
std::list< int > sizes
void finalize(void)
Finalize context client and do some reports.
std::list< int > ranksServerLeader
List of server ranks for which the client is leader.
A context can be both on client and on server side.
StdSize maxBufferedEvents
Maximum number of events that can be buffered.
std::size_t StdSize
Definition: xios_spl.hpp:49
int clientRank
Rank of current client.
bool sendTemporarilyBufferedEvent()
Send the temporarily buffered event (if any).
std::map< int, StdSize > maxEventSizes
Maximum event sizes estimated for each connection to server.
MPI_Comm interComm
Communicator of server group.
int serverSize
Size of server group.
bool hasTemporarilyBufferedEvent() const
bool isServerNotLeader(void) const
Check if client connects to leading server.
std::list< int > ranks
bool havePendingRequests(void)
CContext * context
Context for client.
struct xios::CContextClient::@0 tmpBufferedEvent
void newBuffer(int rank)
Make a new buffer for a certain connection to server with specific rank.
void waitEvent(list< int > &ranks)
If client is also server (attached mode), after sending event, it should process right away the incom...
std::list< CBufferOut * > buffers
bool isServerLeader(void) const
Check if client connects to leading server.