[591] | 1 | #include "xios_spl.hpp" |
---|
[300] | 2 | #include "buffer_in.hpp" |
---|
| 3 | #include "type.hpp" |
---|
| 4 | #include "event_server.hpp" |
---|
| 5 | #include "buffer_server.hpp" |
---|
| 6 | |
---|
[335] | 7 | namespace xios |
---|
[300] | 8 | { |
---|
[682] | 9 | void CEventServer::push(int rank, CServerBuffer* serverBuffer, char* startBuffer, int size) |
---|
[300] | 10 | { |
---|
[682] | 11 | CBufferIn buffer(startBuffer, size); |
---|
| 12 | size_t timeLine; |
---|
| 13 | int myClassId, myType, myNbSender; |
---|
[300] | 14 | |
---|
[682] | 15 | buffer >> size >> timeLine >> myNbSender >> myClassId >> myType; |
---|
[300] | 16 | |
---|
| 17 | if (subEvents.empty()) |
---|
| 18 | { |
---|
[682] | 19 | nbSender = myNbSender; |
---|
| 20 | classId = myClassId; |
---|
| 21 | type = myType; |
---|
[300] | 22 | } |
---|
| 23 | else |
---|
| 24 | { |
---|
[682] | 25 | if (classId != myClassId || type != myType || nbSender != myNbSender) |
---|
| 26 | ERROR("void CEventServer::push(int rank, CServerBuffer* serverBuffer, char* startBuffer, int size)", |
---|
| 27 | << "The callers of event " << timeLine << " are not coherent." << std::endl |
---|
| 28 | << "Received subevent: classId = " << myClassId << ", type = " << myType << ", nbSender = " << myNbSender << std::endl |
---|
[716] | 29 | << "Expected subevent: classId = " << classId << ", type = " << type << ", nbSender = " << nbSender); |
---|
[300] | 30 | } |
---|
| 31 | |
---|
[682] | 32 | SSubEvent ev; |
---|
| 33 | ev.rank = rank; |
---|
| 34 | ev.serverBuffer = serverBuffer; |
---|
| 35 | ev.buffer = new CBufferIn(buffer.ptr(), buffer.remain()); |
---|
| 36 | ev.size = size; |
---|
| 37 | subEvents.push_back(ev); |
---|
[300] | 38 | |
---|
[682] | 39 | if (subEvents.size() > nbSender) |
---|
[300] | 40 | { |
---|
[682] | 41 | ERROR("void CEventServer::push(int rank, CServerBuffer* serverBuffer, char* startBuffer, int size)", |
---|
| 42 | << "The callers of event " << timeLine << " are not coherent." << std::endl |
---|
| 43 | << "Too many subevents have been received (" << subEvents.size() << " instead of " << nbSender << ")."); |
---|
[300] | 44 | } |
---|
| 45 | } |
---|
| 46 | |
---|
| 47 | bool CEventServer::isFull(void) |
---|
| 48 | { |
---|
[682] | 49 | return (nbSender == subEvents.size()); |
---|
[300] | 50 | } |
---|
| 51 | |
---|
| 52 | CEventServer::~CEventServer() |
---|
| 53 | { |
---|
| 54 | list<SSubEvent>::iterator it; |
---|
[682] | 55 | for (it = subEvents.begin(); it != subEvents.end(); it++) |
---|
[300] | 56 | { |
---|
[682] | 57 | it->serverBuffer->freeBuffer(it->size); |
---|
| 58 | delete it->buffer; |
---|
[300] | 59 | } |
---|
| 60 | } |
---|
| 61 | } |
---|