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
00081 std::set<int> enabled_sources() const { return enabled_sources_; }
00082
00087 std::set<int> running_sources() const { return running_sources_; }
00088
00093 std::shared_ptr<SharedMemoryEventManager> getSharedMemoryEventManager() const { return shm_manager_; }
00094
00095
00100 std::shared_ptr<detail::FragCounter> GetReceivedFragmentCount() { return std::shared_ptr<detail::FragCounter>(&recv_frag_count_); }
00101
00102 private:
00103 void runReceiver_(int);
00104
00105 std::atomic<bool> stop_requested_;
00106 std::atomic<size_t> stop_requested_time_;
00107
00108 std::map<int, boost::thread> source_threads_;
00109 std::map<int, std::unique_ptr<TransferInterface>> source_plugins_;
00110 std::set<int> enabled_sources_;
00111 std::set<int> running_sources_;
00112
00113 detail::FragCounter recv_frag_count_;
00114 detail::FragCounter recv_frag_size_;
00115 detail::FragCounter recv_seq_count_;
00116
00117 size_t receive_timeout_;
00118 size_t stop_timeout_ms_;
00119 std::shared_ptr<SharedMemoryEventManager> shm_manager_;
00120
00121 bool non_reliable_mode_enabled_;
00122 size_t non_reliable_mode_retry_count_;
00123 };
00124
00125 inline
00126 size_t
00127 artdaq::DataReceiverManager::
00128 count() const
00129 {
00130 return recv_frag_count_.count();
00131 }
00132
00133 inline
00134 size_t
00135 artdaq::DataReceiverManager::
00136 slotCount(size_t rank) const
00137 {
00138 return recv_frag_count_.slotCount(rank);
00139 }
00140
00141 inline
00142 size_t
00143 artdaq::DataReceiverManager::
00144 byteCount() const
00145 {
00146 return recv_frag_size_.count();
00147 }
00148 #endif //ARTDAQ_DAQRATE_DATATRANSFERMANAGER_HH