#include "xmlioserver_spl.hpp" #include "context_client.hpp" #include "event_client.hpp" #include "buffer_out.hpp" #include "buffer_client.hpp" #include "type.hpp" #include namespace xmlioserver { CContextClient::CContextClient(MPI_Comm intraComm_, MPI_Comm interComm_) { intraComm=intraComm_ ; interComm=interComm_ ; MPI_Comm_rank(intraComm,&clientRank) ; MPI_Comm_size(intraComm,&clientSize) ; MPI_Comm_remote_size(interComm,&serverSize) ; timeLine=0 ; locked=false; } void CContextClient::registerEvent(CEventClient& event) { list::iterator it; map clientBuffer ; for(it=event.serverList.begin();it!=event.serverList.end();it++) { if (connectedServer.find(*it)==connectedServer.end()) { connectedServer.insert(*it) ; buffers[*it]=new CClientBuffer(interComm,*it) ; } } } list CContextClient::newEvent(CEventClient& event,list& sizes) { if (locked==true) ERROR("list CContextClient::newEvent(CEventClient& event,list& sizes)", "event is locked. Please send last event before requesting a new event") ; list buffers ; list::iterator itBuff ; list::iterator it ; // CType ttimeLine(timeLine) ; // int size ; // CType tsize(size) ; // int offset=tsize.size()+ttimeLine.size() ; int size ; timeLine++ ; CMessage msg ; msg<::iterator itServer ; list::ranks ; list::sizes ; list::iterator itSize ; // if (locked==false) ERROR("void CContextClient::sendEvent(CEventClient& event)", // "event is not locked. Please request a new event before sending it") ; ranks=event.getRanks() ; sizes=event.getSizes() ; list msg<::iterator it=sizes.begin();it!=sizes.end();it++) *it+=msg.size() ; list buffList=getBuffers(ranks,sizes) ; for(list::iterator it=buffList.begin(),itSize=sizes.begin() ;;it!=buffList.end();it++) { **it<< for(itServer=event.serverList.begin();itServer!=event.serverList.end();itServer++) { buffers[*itServer]->checkBuffer() ; } } list CContextClient::getBuffers(list& serverList, list& sizeList) { list::iterator itServer,itSize ; list bufferList ; list::iterator itBuffer ; list retBuffer ; bool free ; for(itServer=serverList.begin();itServer!=serverList.end();itServer++) bufferList.push_back(buffers[*itServer]) ; free=false ; while(!free) { free=true ; for(itBuffer=bufferList.begin(),itSize=sizeList.begin(); itBuffer!=bufferList.end();itBuffer++,itSize++) { (*itBuffer)->checkBuffer() ; free&=(*itBuffer)->isBufferFree(*itSize) ; } } for(itBuffer=bufferList.begin(),itSize=sizeList.begin(); itBuffer!=bufferList.end();itBuffer++,itSize++) { retBuffer.push_back((*itBuffer)->getBuffer(*itSize)) ; } return retBuffer ; } }