00001 #ifndef ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
00002 #define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
00003
00004 #include <vector>
00005
00006 #include "artdaq/DAQrate/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 = std::numeric_limits<size_t>::max()) override;
00063
00070 CopyStatus moveFragment(Fragment&& frag, size_t timeout_usec = std::numeric_limits<size_t>::max()) 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 void cancelReq_(MPI_Request req) const;
00091
00092
00093 int findAvailable();
00094
00095 static std::mutex mpi_mutex_;
00096
00097 std::vector<MPI_Request> reqs_;
00098 Fragments payload_;
00099 int pos_;
00100 };
00101 }
00102
00103 #endif //define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH