artdaq  v3_12_02
DataReceiverManager.hh
1 #ifndef ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
2 #define ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
3 
4 #include "TRACE/tracemf.h" // Pre-empt TRACE/trace.h from Fragment.hh.
5 #include "artdaq-core/Data/Fragment.hh"
6 
7 #include <condition_variable>
8 #include <map>
9 #include <memory>
10 #include <set>
11 
12 #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
13 #include "artdaq/DAQrate/detail/FragCounter.hh"
14 #include "artdaq/TransferPlugins/TransferInterface.hh"
15 
16 namespace fhicl {
17 class ParameterSet;
18 }
19 
20 namespace artdaq {
21 class DataReceiverManager;
22 }
23 
30 {
31 public:
47  explicit DataReceiverManager(const fhicl::ParameterSet& ps, std::shared_ptr<SharedMemoryEventManager> shm);
48 
52  virtual ~DataReceiverManager();
53 
58  size_t count() const;
59 
65  size_t slotCount(size_t rank) const;
66 
71  size_t byteCount() const;
72 
76  void start_threads();
77 
81  void stop_threads();
82 
87  std::set<int> enabled_sources() const;
88 
93  std::set<int> running_sources() const;
94 
99  std::shared_ptr<SharedMemoryEventManager> getSharedMemoryEventManager() const { return shm_manager_; }
100 
101 private:
102  DataReceiverManager(DataReceiverManager const&) = delete;
104  DataReceiverManager& operator=(DataReceiverManager const&) = delete;
105  DataReceiverManager& operator=(DataReceiverManager&&) = delete;
106 
107  void runReceiver_(int);
108 
109  std::atomic<bool> stop_requested_;
110  std::atomic<size_t> stop_requested_time_;
111 
112  std::map<int, boost::thread> source_threads_;
113  std::map<int, std::unique_ptr<TransferInterface>> source_plugins_;
114 
115  std::unordered_map<int, std::atomic<bool>> enabled_sources_;
116  std::unordered_map<int, std::atomic<bool>> running_sources_;
117 
118  detail::FragCounter recv_frag_count_; // Number of frags received per source.
119  detail::FragCounter recv_frag_size_; // Number of bytes received per source.
120  detail::FragCounter recv_seq_count_; // For counting sequence IDs
121 
122  size_t receive_timeout_;
123  size_t stop_timeout_ms_;
124  std::shared_ptr<SharedMemoryEventManager> shm_manager_;
125 
126  bool non_reliable_mode_enabled_;
127  size_t non_reliable_mode_retry_count_;
128 };
129 
130 inline size_t
132  count() const
133 {
134  return recv_frag_count_.count();
135 }
136 
137 inline size_t
139  slotCount(size_t rank) const
140 {
141  return recv_frag_count_.slotCount(rank);
142 }
143 
144 inline size_t
146  byteCount() const
147 {
148  return recv_frag_size_.count();
149 }
150 #endif // ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
std::set< int > running_sources() const
Get the list of sources which are still receiving data.
Keep track of the count of Fragments received from a set of sources.
Definition: FragCounter.hh:18
DataReceiverManager(const fhicl::ParameterSet &ps, std::shared_ptr< SharedMemoryEventManager > shm)
DataReceiverManager Constructor.
std::set< int > enabled_sources() const
Get the list of enabled sources.
std::shared_ptr< SharedMemoryEventManager > getSharedMemoryEventManager() const
Get a handle to the SharedMemoryEventManager connected to this DataReceiverManager.
Receives Fragment objects from one or more DataSenderManager instances using TransferInterface plugin...
size_t slotCount(size_t rank) const
Get the count of Fragment objects received by this DataReceiverManager from a given source...
size_t count() const
Return the count of Fragment objects received by this DataReceiverManager.
virtual ~DataReceiverManager()
DataReceiverManager Destructor.
void start_threads()
Start receiver threads for all enabled sources.
size_t count() const
Get the total number of Fragments received.
Definition: FragCounter.hh:120
void stop_threads()
Stop receiver threads.
size_t byteCount() const
Get the total size of all data recieved by this DataReceiverManager.