00001 #ifndef ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
00002 #define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
00003
00004 #include <vector>
00005
00006 #include "artdaq-mpich-plugin/Utilities/quiet_mpi.hh"
00007 #include "artdaq-core/Data/Fragment.hh"
00008 #include "artdaq/TransferPlugins/TransferInterface.hh"
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 namespace artdaq
00020 {
00024 class MPITransfer : public TransferInterface
00025 {
00026 public:
00038 MPITransfer(fhicl::ParameterSet pset, Role role);
00039
00043 MPITransfer(const MPITransfer&) = delete;
00044
00049 MPITransfer& operator=(const MPITransfer&) = delete;
00050
00054 virtual ~MPITransfer();
00055
00062 CopyStatus copyFragment(Fragment& frag, size_t timeout_usec) override;
00063
00070 CopyStatus moveFragment(Fragment&& frag) override;
00071
00078 int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override;
00079
00086 int receiveFragmentData(RawDataType* destination, size_t wordCount) override;
00087
00088 private:
00089
00090 CopyStatus sendFragment(Fragment&& frag, size_t timeout_usec);
00091
00092 void cancelReq_(MPI_Request req) const;
00093
00094
00095 int findAvailable();
00096
00097 static std::mutex mpi_mutex_;
00098
00099 std::vector<MPI_Request> reqs_;
00100 Fragments payload_;
00101 int pos_;
00102 };
00103 }
00104
00105 #endif //define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH