00001 #ifndef ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
00002 #define ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH
00003
00004 #include <map>
00005 #include <set>
00006 #include <memory>
00007 #include <condition_variable>
00008
00009 #include "fhiclcpp/fwd.h"
00010
00011 #include "artdaq-core/Data/Fragment.hh"
00012 #include "artdaq/TransferPlugins/TransferInterface.hh"
00013 #include "artdaq/DAQrate/detail/FragCounter.hh"
00014 #include "artdaq-utilities/Plugins/MetricManager.hh"
00015 #include "artdaq/DAQrate/SharedMemoryEventManager.hh"
00016
00017 namespace artdaq
00018 {
00019 class DataReceiverManager;
00020 }
00021
00027 class artdaq::DataReceiverManager
00028 {
00029 public:
00030
00046 explicit DataReceiverManager(const fhicl::ParameterSet& ps, std::shared_ptr<SharedMemoryEventManager> shm);
00047
00051 virtual ~DataReceiverManager();
00052
00057 size_t count() const;
00058
00064 size_t slotCount(size_t rank) const;
00065
00070 size_t byteCount() const;
00071
00075 void start_threads();
00076
00080 void stop_threads();
00081
00086 std::set<int> enabled_sources() const { return enabled_sources_; }
00087
00092 std::set<int> running_sources() const { return running_sources_; }
00093
00098 std::shared_ptr<SharedMemoryEventManager> getSharedMemoryEventManager() const { return shm_manager_; }
00099
00100
00105 std::shared_ptr<detail::FragCounter> GetReceivedFragmentCount() { return std::shared_ptr<detail::FragCounter>(&recv_frag_count_); }
00106
00107 private:
00108 void runReceiver_(int);
00109
00110 std::atomic<bool> stop_requested_;
00111 std::atomic<size_t> stop_requested_time_;
00112
00113 std::map<int, boost::thread> source_threads_;
00114 std::map<int, std::unique_ptr<TransferInterface>> source_plugins_;
00115 std::set<int> enabled_sources_;
00116 std::set<int> running_sources_;
00117
00118 detail::FragCounter recv_frag_count_;
00119 detail::FragCounter recv_frag_size_;
00120 detail::FragCounter recv_seq_count_;
00121
00122 size_t receive_timeout_;
00123 size_t stop_timeout_ms_;
00124 std::shared_ptr<SharedMemoryEventManager> shm_manager_;
00125
00126 bool non_reliable_mode_enabled_;
00127 size_t non_reliable_mode_retry_count_;
00128 };
00129
00130 inline
00131 size_t
00132 artdaq::DataReceiverManager::
00133 count() const
00134 {
00135 return recv_frag_count_.count();
00136 }
00137
00138 inline
00139 size_t
00140 artdaq::DataReceiverManager::
00141 slotCount(size_t rank) const
00142 {
00143 return recv_frag_count_.slotCount(rank);
00144 }
00145
00146 inline
00147 size_t
00148 artdaq::DataReceiverManager::
00149 byteCount() const
00150 {
00151 return recv_frag_size_.count();
00152 }
00153 #endif //ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH