Receive a buffered message. */
| 206 | |
| 207 | /** Receive a buffered message. */ |
| 208 | void CommLayer::receiveBufferedMessage(MessagePtrVector& outmessages) |
| 209 | { |
| 210 | assert(outmessages.empty()); |
| 211 | int flag; |
| 212 | MPI_Status status; |
| 213 | MPI_Test(&m_request, &flag, &status); |
| 214 | assert(flag); |
| 215 | assert((APMessage)status.MPI_TAG == APM_BUFFERED); |
| 216 | |
| 217 | int size; |
| 218 | MPI_Get_count(&status, MPI_BYTE, &size); |
| 219 | |
| 220 | int offset = 0; |
| 221 | while (offset < size) { |
| 222 | MessageType type = Message::readMessageType( |
| 223 | (char*)m_rxBuffer + offset); |
| 224 | |
| 225 | Message* pNewMessage; |
| 226 | switch(type) |
| 227 | { |
| 228 | case MT_ADD: |
| 229 | pNewMessage = new SeqAddMessage(); |
| 230 | break; |
| 231 | case MT_REMOVE: |
| 232 | pNewMessage = new SeqRemoveMessage(); |
| 233 | break; |
| 234 | case MT_SET_FLAG: |
| 235 | pNewMessage = new SetFlagMessage(); |
| 236 | break; |
| 237 | case MT_REMOVE_EXT: |
| 238 | pNewMessage = new RemoveExtensionMessage(); |
| 239 | break; |
| 240 | case MT_SEQ_DATA_REQUEST: |
| 241 | pNewMessage = new SeqDataRequest(); |
| 242 | break; |
| 243 | case MT_SEQ_DATA_RESPONSE: |
| 244 | pNewMessage = new SeqDataResponse(); |
| 245 | break; |
| 246 | case MT_SET_BASE: |
| 247 | pNewMessage = new SetBaseMessage(); |
| 248 | break; |
| 249 | default: |
| 250 | pNewMessage = new SeqDataRequest(); |
| 251 | assert(false); |
| 252 | break; |
| 253 | } |
| 254 | |
| 255 | // Unserialize the new message from the buffer |
| 256 | offset += pNewMessage->unserialize( |
| 257 | (char*)m_rxBuffer + offset); |
| 258 | |
| 259 | // Constructed message will be deleted in the |
| 260 | // NetworkSequenceCollection calling function. |
| 261 | outmessages.push_back(pNewMessage); |
| 262 | } |
| 263 | assert(offset == size); |
| 264 | |
| 265 | assert(m_request == MPI_REQUEST_NULL); |
no test coverage detected