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
00069 CopyStatus moveFragment(Fragment&& frag) override;
00070
00077 int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override;
00078
00085 int receiveFragmentData(RawDataType* destination, size_t wordCount) override;
00086
00087 private:
00088
00089 CopyStatus sendFragment(Fragment&& frag, size_t timeout_usec);
00090
00091 void cancelReq_(MPI_Request req) const;
00092
00093
00094 int findAvailable();
00095
00096 static std::mutex mpi_mutex_;
00097
00098 std::vector<MPI_Request> reqs_;
00099 Fragments payload_;
00100 int pos_;
00101 };
00102 }
00103
00104 #endif //define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH