inline static void UnpackDest(void *buf, snet_dest_t *dest) { UnpackInt(buf, 1, &dest->dest); UnpackInt(buf, 1, &dest->parent); UnpackInt(buf, 1, &dest->dynamicIndex); UnpackInt(buf, 1, &dest->parentNode); UnpackInt(buf, 1, &dest->dynamicLoc); }
//============================================================================= unsigned int NetMsg::UnpackString(char *data) { unsigned int length = UnpackInt(); memcpy((void *)data, mBuffer+mPlace, length); mPlace += length; return length; }
snet_msg_t SNetDistribRecvMsg(void) { int count; snet_msg_t result; MPI_Status status; static mpi_buf_t recvBuf = {0, 0, NULL}; MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); MPI_Get_count(&status, MPI_PACKED, &count); MPI_Pack_size(count, MPI_PACKED, MPI_COMM_WORLD, &recvBuf.offset); if ((unsigned) recvBuf.offset > recvBuf.size) { SNetMemFree(recvBuf.data); recvBuf.data = SNetMemAlloc(recvBuf.offset); recvBuf.size = recvBuf.offset; } MPI_Recv(recvBuf.data, count, MPI_PACKED, MPI_ANY_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, &status); recvBuf.offset = 0; result.type = status.MPI_TAG; switch (result.type) { case snet_rec: result.rec = SNetRecDeserialise(&recvBuf, &UnpackInt, &UnpackRef); case snet_block: case snet_unblock: result.dest.node = status.MPI_SOURCE; UnpackDest(&recvBuf, &result.dest); break; case snet_ref_set: result.ref = SNetRefDeserialise(&recvBuf, &UnpackInt, &UnpackByte); result.data = (uintptr_t) SNetInterfaceGet(SNetRefInterface(result.ref))->unpackfun(&recvBuf); break; case snet_ref_fetch: result.ref = SNetRefDeserialise(&recvBuf, &UnpackInt, &UnpackByte); result.data = status.MPI_SOURCE; break; case snet_ref_update: result.ref = SNetRefDeserialise(&recvBuf, &UnpackInt, &UnpackByte); UnpackInt(&recvBuf, 1, &result.val); break; default: break; } return result; }