artdaq  v3_00_03
MPITransfer.hh
1 #ifndef ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
2 #define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
3 
4 #include <vector>
5 
7 #include "artdaq-core/Data/Fragment.hh"
8 #include "artdaq/TransferPlugins/TransferInterface.hh"
9 
10 /*
11  Protocol: want to do a send for each request object, then wait for for
12  pending requests to complete, followed by a reset to allow another set
13  of sends to be completed.
14 
15  This needs to be separated into a thing for sending and a thing for receiving.
16  There probably needs to be a common class that both use.
17 */
18 
19 namespace artdaq
20 {
25  {
26  public:
38  MPITransfer(fhicl::ParameterSet pset, Role role);
39 
43  MPITransfer(const MPITransfer&) = delete;
44 
49  MPITransfer& operator=(const MPITransfer&) = delete;
50 
54  virtual ~MPITransfer();
55 
62  CopyStatus copyFragment(Fragment& frag, size_t timeout_usec = std::numeric_limits<size_t>::max()) override;
63 
70  CopyStatus moveFragment(Fragment&& frag, size_t timeout_usec = std::numeric_limits<size_t>::max()) override;
71 
78  int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override;
79 
86  int receiveFragmentData(RawDataType* destination, size_t wordCount) override;
87 
88  private:
89 
90  void cancelReq_(MPI_Request req) const;
91 
92  // Identify an available buffer.
93  int findAvailable();
94 
95  static std::mutex mpi_mutex_;
96 
97  std::vector<MPI_Request> reqs_;
98  Fragments payload_;
99  int pos_;
100  };
101 }
102 
103 #endif //define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
Role role() const
Get the TransferInterface::Role of this TransferInterface.
virtual ~MPITransfer()
MPITransfer Destructor.
Definition: MPI_transfer.cc:45
CopyStatus moveFragment(Fragment &&frag, size_t timeout_usec=std::numeric_limits< size_t >::max()) override
Move a Fragment to the destination.
Definition: MPI_transfer.cc:78
int receiveFragmentHeader(detail::RawFragmentHeader &header, size_t receiveTimeout) override
Receive a Fragment Header from the transport mechanism.
MPITransfer(fhicl::ParameterSet pset, Role role)
MPITransfer Constructor.
Definition: MPI_transfer.cc:26
Role
Used to determine if a TransferInterface is a Sender or Receiver.
MPITransfer & operator=(const MPITransfer &)=delete
Copy Assignment operator is deleted.
CopyStatus copyFragment(Fragment &frag, size_t timeout_usec=std::numeric_limits< size_t >::max()) override
Copy a Fragment to the destination. Forces asynchronous send.
Definition: MPI_transfer.cc:71
This interface defines the functions used to transfer data between artdaq applications.
MPITransfer is a TransferInterface implementation plugin that transfers data using MPI...
Definition: MPITransfer.hh:24
CopyStatus
Returned from the send functions, this enumeration describes the possible return codes. If an exception occurs, it will be thrown and should be handled normally.
int receiveFragmentData(RawDataType *destination, size_t wordCount) override
Receive the body of a Fragment to the given destination pointer.