artdaq  v2_03_02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
ShmemTransfer.hh
1 #ifndef artdaq_TransferPlugins_ShmemTransfer_hh
2 #define artdaq_TransferPlugins_ShemmTransfer_hh
3 
4 #include "fhiclcpp/fwd.h"
5 #include <atomic>
6 
7 #include "artdaq/TransferPlugins/TransferInterface.hh"
8 
9 #define BUFFER_EMPTY 0UL
10 #define WRITING_FRAGMENT 1UL
11 #define FRAGMENT_READY 2UL
12 #define READING_FRAGMENT 3UL
13 
14 namespace artdaq
15 {
20  {
21  public:
22 
34  ShmemTransfer(fhicl::ParameterSet const& pset, Role role);
35 
39  virtual ~ShmemTransfer() noexcept;
40 
47  int receiveFragment(Fragment& fragment,
48  size_t receiveTimeout) override;
49 
56  CopyStatus copyFragment(Fragment& fragment,
57  size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
58 
65  CopyStatus moveFragment(Fragment&& fragment,
66  size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
67 
68  private:
69  CopyStatus sendFragment(Fragment&& fragment,
70  size_t send_timeout_usec, bool reliable = false);
71 
72  bool readyForRead_();
73 
74  bool readyForWrite_();
75 
76  RawDataType* offsetToPtr(size_t offset);
77 
78  struct ShmBuffer
79  {
80  size_t offset;
81  size_t fragmentSizeWords;
82  std::atomic<unsigned int> sem;
83  unsigned int writeCount;
84  };
85 
86  struct ShmStruct
87  {
88  std::atomic<unsigned int> read_pos;
89  std::atomic<unsigned int> write_pos;
90  ShmBuffer buffers[100];
91  };
92 
93 
94  size_t send_timeout_usec_;
95  int shm_segment_id_;
96  ShmStruct* shm_ptr_;
97  int shm_key_;
98 
99  Role role_;
100  };
101 }
102 
103 #endif // artdaq_TransferPlugins/ShmemTransfer_hh
Role role() const
Get the TransferInterface::Role of this TransferInterface.
CopyStatus moveFragment(Fragment &&fragment, size_t send_timeout_usec=std::numeric_limits< size_t >::max()) override
Move a Fragment to the destination.
CopyStatus copyFragment(Fragment &fragment, size_t send_timeout_usec=std::numeric_limits< size_t >::max()) override
Copy a Fragment to the destination. May be unreliable.
ShmemTransfer(fhicl::ParameterSet const &pset, Role role)
ShmemTransfer Constructor.
virtual ~ShmemTransfer() noexcept
ShmemTransfer Destructor.
Role
Used to determine if a TransferInterface is a Sender or Receiver.
A TransferInterface implementation plugin that transfers data using Shared Memory.
This interface defines the functions used to transfer data between artdaq applications.
int receiveFragment(Fragment &fragment, size_t receiveTimeout) override
Receive a Fragment from Shared Memory.
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.