source: XMLIO_V2/dev/dev_rv/src/xmlio/server.cpp @ 204

Last change on this file since 204 was 199, checked in by hozdoba, 13 years ago
File size: 7.3 KB
Line 
1#include "server.hpp"
2
3namespace xmlioserver {
4namespace comm {
5
6   /// ////////////////////// Définitions ////////////////////// ///
7   
8   CServer::CServer(MPIComm comm_client_server)
9      : blist(comm_client_server)
10   { /* Ne rien faire de plus */ } 
11       
12   CServer::~CServer(void)
13   { /* Ne rien faire de plus */ } 
14   
15   ///--------------------------------------------------------------
16   
17   const CBufferList & CServer::getBufferList(void) const 
18   {
19      return (this->blist);
20   }   
21   
22   //---------------------------------------------------------------
23   
24   void CServer::run(void)
25   {
26      while (this->blist.recvRequests())
27      {
28         long int managerId = -1, methodId  = -1, nbargs  = -1;
29         long int managerId_= -1, methodId_ = -1, nbargs_ = -1;
30         std::vector<CLinearBuffer> lbuffer;
31         this->blist.getRequests(lbuffer);
32                 
33         for (StdSize i = 0; i < lbuffer.size(); i++)
34         {           
35            lbuffer[i].getRequestInfos(0, managerId, methodId, nbargs);
36            if (((managerId_ != managerId) || (methodId_ != methodId) || (nbargs_ != nbargs)) && (i != 0 ))
37            {
38               //std::cout << managerId_ << "<->" << managerId << std::endl
39               //          << methodId_  << "<->" << methodId  << std::endl
40               //          << nbargs_    << "<->" << nbargs    << std::endl;
41               ERROR("CServer::run(void)", << "[" << i << "] Les requêtes ne sont pas synchronisées !");
42            }
43            managerId_ = managerId;
44            methodId_  = methodId;
45            nbargs_    = nbargs;
46         }
47           
48         if (managerId == 0)
49         {
50            switch(methodId)
51            {
52               case (0) :
53                  this->initialize();
54                  continue;
55               case (1) :
56                  this->finalize();
57                  return;
58               default  :
59                  ERROR("CServer::run(void)", 
60                     << "[ managerId = " << managerId << ", "
61                     << "[ methodId = "  << methodId  << ", "
62                     << "[ nbargs = "    << nbargs    << "] "
63                     << " Methode inconnue !");
64            }
65         }
66         if (managerId == 1)
67         {
68            switch(methodId)
69            {
70               case (0) :
71                  this->setContext(lbuffer);
72                  continue;
73               case (1) :
74                  this->updateCalendar(lbuffer);
75                  continue;
76               default  :
77                  ERROR("CServer::run(void)", 
78                     << "[ managerId = " << managerId << ", "
79                     << "[ methodId = "  << methodId  << ", "
80                     << "[ nbargs = "    << nbargs    << "] "
81                     << " Methode inconnue !");
82            }
83         }
84         if (managerId == 2)
85         {
86            switch(methodId)
87            {
88               case (0) :
89                  this->writeData(lbuffer, 4);
90                  continue;
91               case (1) :
92                  this->writeData(lbuffer, 8);
93                  continue;
94               default  :
95                  ERROR("CServer::run(void)", 
96                     << "[ managerId = " << managerId << ", "
97                     << "[ methodId = "  << methodId  << ", "
98                     << "[ nbargs = "    << nbargs    << "] "
99                     << " Methode inconnue !");
100            }
101         }
102         ERROR("CServer::run(void)", 
103                << "[ managerId = " << managerId << ", "
104                << "[ methodId = "  << methodId  << ", "
105                << "[ nbargs = "    << nbargs    << "] "
106                << " Methode inconnue !");
107      }
108   }
109
110   //--------------------------------------------------------------
111   
112   void CServer::initialize(void) // manager 0, method 0
113   {
114      // Ne rien faire de plus
115   }
116   
117   //--------------------------------------------------------------
118   
119   void CServer::finalize(void) // manager 0, method 1
120   {
121       comm::CMPIManager::Barrier();
122   }   
123   
124   //--------------------------------------------------------------
125             
126   void CServer::setContext(const std::vector<CLinearBuffer> & buffer) // manager 1, method 0
127   { 
128      StdString contextId;
129      for (StdSize i = 0; i < buffer.size(); i++)
130      {
131         StdString contextId_ = buffer[i].getString(3);
132         if (contextId.compare(contextId_) != 0 && (i != 0))
133         {
134            ERROR("CServer::setContext(const std::vector<CLinearBuffer> & buffer)", 
135                  << "[ contextId 1 = " << contextId   << ", "
136                  << "[ contextId 2 = " << contextId_  << "] "
137                  << " Changement de contexte désynchronisé !");
138         }
139         else contextId = contextId_;
140         
141      }
142      std::cout << "setContext called " << contextId << std::endl;
143   }
144   
145   //--------------------------------------------------------------
146   
147   void CServer::updateCalendar(const std::vector<CLinearBuffer> & buffer) // manager 1, method 1
148   {
149      int timestep = -1;
150      for (StdSize i = 0; i < buffer.size(); i++)
151      {
152         int timestep_ = buffer[i].getInt(3);
153         if ((timestep_ != timestep)  && (i != 0))
154         {
155            ERROR("CServer::updateCalendar(const std::vector<CLinearBuffer> & buffer)", 
156                  << "[ timestep 1 = " << timestep   << ", "
157                  << "[ timestep 2 = " << timestep_  << "] "
158                  << " Mise à jour du calendrier désynchronisée !");
159         }
160         else timestep = timestep_;
161      }
162      std::cout << "updateCalendar called " << timestep <<std::endl;
163   }
164   
165   //--------------------------------------------------------------
166         
167   void CServer::writeData(const std::vector<CLinearBuffer> & buffer, int prec)  // manager 2, method 0 - 1
168   {
169      StdString fieldId;
170      for (StdSize i = 0; i < buffer.size(); i++)
171      {
172         StdString fieldId_ = buffer[i].getString(3);
173         if (fieldId.compare(fieldId_) != 0 && (i != 0))
174         {           
175            ERROR("CServer::writeData(const std::vector<CLinearBuffer> & buffer, int prec)", 
176                  << "[fieldId 1 = " << fieldId   << ", "
177                  << " fieldId 2 = " << fieldId_  << "] "
178                  << " Ecriture des données désynchronisée !");
179         }
180         else fieldId = fieldId_;         
181      }
182     
183      if (prec == 4)
184      {
185         std::deque<ARRAY(float, 1)> dataArray(buffer.size());
186         for (StdSize i = 0; i < buffer.size(); i++)
187            dataArray[i] = buffer[i].getFloatArray(4);
188
189         std::cout << "writeData called (float) " << fieldId << ", " << dataArray[0] << std::endl;
190         return;
191      }     
192      else if (prec == 8)
193      {
194         std::deque<ARRAY(double, 1)> dataArray(buffer.size());
195         for (StdSize i = 0; i < buffer.size(); i++)
196            dataArray[i] = buffer[i].getDoubleArray(4);
197
198         std::cout << "writeData called (double) " << fieldId << ", " << dataArray[0]  << std::endl;
199         return;
200      }     
201      else
202      {
203         ERROR("CServer::writeData(const std::vector<CLinearBuffer> & buffer, int prec)", 
204               << " Précision des données invalide !");
205      }
206   }
207 
208   ///--------------------------------------------------------------
209   
210   
211} // namespace comm
212} // namespace xmlioserver
Note: See TracBrowser for help on using the repository browser.