source: XMLIO_V2/dev/common/src/context_client.cpp.old @ 300

Last change on this file since 300 was 300, checked in by ymipsl, 10 years ago

nouvelle version de developpement de xios

  • nouvelle interface fortran
  • recodage complet de la couche de communication
  • et bien d'autres choses...

YM

File size: 4.0 KB
Line 
1#include "xmlioserver_spl.hpp"
2#include "context_client.hpp"
3#include "event_client.hpp"
4#include "buffer_out.hpp"
5#include "buffer_client.hpp"
6#include "type.hpp"
7#include <mpi.h>
8
9namespace xmlioserver
10{
11
12
13    CContextClient::CContextClient(MPI_Comm intraComm_, MPI_Comm interComm_)
14    {
15      intraComm=intraComm_ ;
16      interComm=interComm_ ;
17      MPI_Comm_rank(intraComm,&clientRank) ;
18      MPI_Comm_size(intraComm,&clientSize) ;
19      MPI_Comm_remote_size(interComm,&serverSize) ;
20     
21      timeLine=0 ;
22      locked=false;
23    }
24
25
26
27    void CContextClient::registerEvent(CEventClient& event)
28    {
29      list<int>::iterator it;
30      map<int,CClientBuffer*> clientBuffer ;
31     
32      for(it=event.serverList.begin();it!=event.serverList.end();it++)
33      {
34       
35        if (connectedServer.find(*it)==connectedServer.end())
36        {
37          connectedServer.insert(*it) ;
38          buffers[*it]=new CClientBuffer(interComm,*it) ;
39        }
40      }
41    }
42
43
44
45    list<CBufferOut*> CContextClient::newEvent(CEventClient& event,list<int>& sizes)
46    {
47     
48      if (locked==true) ERROR("list<CBufferOut*> CContextClient::newEvent(CEventClient& event,list<int>& sizes)",
49                              "event is locked. Please send last event before requesting a new event") ;
50     
51      list<CBufferOut*> buffers ;
52      list<CBufferOut*>::iterator itBuff ;
53      list<int>::iterator it ;
54     
55//      CType<size_t> ttimeLine(timeLine) ;
56//      int size ;
57//      CType<int> tsize(size) ;
58//      int offset=tsize.size()+ttimeLine.size() ;
59
60      int size ;
61      timeLine++ ;
62      CMessage msg ;
63      msg<<size<<timeLine ;
64           
65      for(it=sizes.begin();it!=sizes.end();it++) *it+=msg.size() ;
66      buffers=getBuffers(event.serverList,sizes) ;
67     
68      it=sizes.begin() ;
69      for(itBuff=buffers.begin();itBuff!=buffers.end();itBuff++)
70      {
71        size=*it ;
72        *(*itBuff)<<msg ;
73        it++ ;
74      }     
75   
76      locked=true ;
77      return buffers ;
78   
79    }
80   
81
82
83    void CContextClient::sendEvent(CEventClient& event)
84    {
85      list<int>::iterator itServer ;
86      list<int>::ranks ;
87      list<int>::sizes ; 
88      list<int>::iterator itSize ;
89     
90//      if (locked==false) ERROR("void CContextClient::sendEvent(CEventClient& event)",
91//                              "event is not locked. Please request a new event before sending it") ;
92      ranks=event.getRanks() ;
93      sizes=event.getSizes() ;
94     
95      list<CMessage> msg<<sizes.begin()<<timeLine ;
96     
97      for(list<int>::iterator it=sizes.begin();it!=sizes.end();it++) *it+=msg.size() ;
98      list<CBufferOut*> buffList=getBuffers(ranks,sizes) ;
99     
100     
101     
102      for(list<CBufferOut*>::iterator it=buffList.begin(),itSize=sizes.begin() ;;it!=buffList.end();it++)
103      {
104         **it<<
105       
106     
107     
108                               
109      for(itServer=event.serverList.begin();itServer!=event.serverList.end();itServer++)
110      {
111        buffers[*itServer]->checkBuffer() ;
112      }
113    }
114   
115
116
117    list<CBufferOut*> CContextClient::getBuffers(list<int>& serverList, list<int>& sizeList)
118    {
119      list<int>::iterator itServer,itSize ;
120      list<CClientBuffer*> bufferList ;
121      list<CClientBuffer*>::iterator itBuffer ;
122      list<CBufferOut*>  retBuffer ;
123      bool free ;
124     
125      for(itServer=serverList.begin();itServer!=serverList.end();itServer++) bufferList.push_back(buffers[*itServer]) ;
126
127      free=false ;
128      while(!free)
129      {
130        free=true ;
131        for(itBuffer=bufferList.begin(),itSize=sizeList.begin(); itBuffer!=bufferList.end();itBuffer++,itSize++)
132        {
133          (*itBuffer)->checkBuffer() ;
134          free&=(*itBuffer)->isBufferFree(*itSize) ;
135        }
136      }
137     
138      for(itBuffer=bufferList.begin(),itSize=sizeList.begin(); itBuffer!=bufferList.end();itBuffer++,itSize++)
139      {
140        retBuffer.push_back((*itBuffer)->getBuffer(*itSize)) ;
141      }
142     
143      return retBuffer ;             
144   
145   }
146     
147     
148
149}     
Note: See TracBrowser for help on using the repository browser.