artdaq  v3_03_00
DataReceiverManager.hh
1 #ifndef ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
2 #define ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
3 
4 #include <map>
5 #include <set>
6 #include <memory>
7 #include <condition_variable>
8 
9 #include "fhiclcpp/fwd.h"
10 
11 #include "artdaq-core/Data/Fragment.hh"
12 #include "artdaq/TransferPlugins/TransferInterface.hh"
13 #include "artdaq/DAQrate/detail/FragCounter.hh"
14 #include "artdaq-utilities/Plugins/MetricManager.hh"
15 #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
16 
17 namespace artdaq
18 {
19  class DataReceiverManager;
20 }
21 
28 {
29 public:
30 
46  explicit DataReceiverManager(const fhicl::ParameterSet& ps, std::shared_ptr<SharedMemoryEventManager> shm);
47 
51  virtual ~DataReceiverManager();
52 
57  size_t count() const;
58 
64  size_t slotCount(size_t rank) const;
65 
70  size_t byteCount() const;
71 
75  void start_threads();
76 
80  void stop_threads();
81 
86  std::set<int> enabled_sources() const;
87 
92  std::set<int> running_sources() const;
93 
98  std::shared_ptr<SharedMemoryEventManager> getSharedMemoryEventManager() const { return shm_manager_; }
99 
100 
105  std::shared_ptr<detail::FragCounter> GetReceivedFragmentCount() { return std::shared_ptr<detail::FragCounter>(&recv_frag_count_); }
106 
107 private:
108  void runReceiver_(int);
109 
110  std::atomic<bool> stop_requested_;
111  std::atomic<size_t> stop_requested_time_;
112 
113  std::map<int, boost::thread> source_threads_;
114  std::map<int, std::unique_ptr<TransferInterface>> source_plugins_;
115 
116  struct source_metric_data
117  {
118  source_metric_data() : delta_t(0), hdr_delta_t(0), store_delta_t(0), data_delta_t(0),dead_t(0), data_point_count(0), data_size(0), header_size(0) {}
119  double delta_t;
120  double hdr_delta_t;
121  double store_delta_t;
122  double data_delta_t;
123  double dead_t;
124  size_t data_point_count;
125  size_t data_size;
126  size_t header_size;
127  };
128 
129  std::unordered_map<int, source_metric_data> source_metric_data_;
130  std::unordered_map<int, std::chrono::steady_clock::time_point> source_metric_send_time_;
131  std::unordered_map<int, std::atomic<bool>> enabled_sources_;
132  std::unordered_map<int, std::atomic<bool>> running_sources_;
133 
134  detail::FragCounter recv_frag_count_; // Number of frags received per source.
135  detail::FragCounter recv_frag_size_; // Number of bytes received per source.
136  detail::FragCounter recv_seq_count_; // For counting sequence IDs
137 
138  size_t receive_timeout_;
139  size_t stop_timeout_ms_;
140  std::shared_ptr<SharedMemoryEventManager> shm_manager_;
141 
142  bool non_reliable_mode_enabled_;
143  size_t non_reliable_mode_retry_count_;
144 };
145 
146 inline
147 size_t
149 count() const
150 {
151  return recv_frag_count_.count();
152 }
153 
154 inline
155 size_t
157 slotCount(size_t rank) const
158 {
159  return recv_frag_count_.slotCount(rank);
160 }
161 
162 inline
163 size_t
165 byteCount() const
166 {
167  return recv_frag_size_.count();
168 }
169 #endif //ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
std::set< int > running_sources() const
Get the list of sources which are still receiving data.
std::shared_ptr< detail::FragCounter > GetReceivedFragmentCount()
Get a pointer to the FragCounter instance tracking the number of received Fragments.
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:128
void stop_threads()
Stop receiver threads.
size_t byteCount() const
Get the total size of all data recieved by this DataReceiverManager.