00001 #ifndef ARTDAQ_DAQRATE_DATASENDERMANAGER_HH
00002 #define ARTDAQ_DAQRATE_DATASENDERMANAGER_HH
00003
00004 #include <map>
00005 #include <set>
00006 #include <memory>
00007 #include <netinet/in.h>
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/detail/RoutingPacket.hh"
00016
00017 namespace artdaq
00018 {
00019 class DataSenderManager;
00020 }
00021
00026 class artdaq::DataSenderManager
00027 {
00028 public:
00029
00052 explicit DataSenderManager(const fhicl::ParameterSet& ps);
00053
00057 virtual ~DataSenderManager();
00058
00064 int sendFragment(Fragment&& frag);
00065
00070 size_t count() const;
00071
00077 size_t slotCount(size_t rank) const;
00078
00083 size_t destinationCount() const { return destinations_.size(); }
00084
00089 std::set<int> enabled_destinations() const { return enabled_destinations_; }
00090
00095 size_t GetRoutingTableEntryCount() const;
00096 private:
00097
00098
00099 int calcDest_(Fragment::sequence_id_t) const;
00100
00101 void setupTableListener_();
00102
00103 void startTableReceiverThread_();
00104
00105 void receiveTableUpdatesLoop_();
00106 private:
00107
00108 std::map<int, std::unique_ptr<artdaq::TransferInterface>> destinations_;
00109 std::set<int> enabled_destinations_;
00110
00111 detail::FragCounter sent_frag_count_;
00112
00113 bool broadcast_sends_;
00114 bool non_blocking_mode_;
00115 size_t send_timeout_us_;
00116
00117 bool use_routing_master_;
00118 detail::RoutingMasterMode routing_master_mode_;
00119 std::atomic<bool> should_stop_;
00120 int table_port_;
00121 std::string table_address_;
00122 struct sockaddr_in table_addr_;
00123 int ack_port_;
00124 std::string ack_address_;
00125 struct sockaddr_in ack_addr_;
00126 int ack_socket_;
00127 int table_socket_;
00128 std::map<Fragment::sequence_id_t, int> routing_table_;
00129 mutable std::mutex routing_mutex_;
00130 boost::thread routing_thread_;
00131 mutable std::atomic<size_t> routing_wait_time_;
00132
00133 int routing_timeout_ms_;
00134 int routing_retry_count_;
00135 };
00136
00137 inline
00138 size_t
00139 artdaq::DataSenderManager::
00140 count() const
00141 {
00142 return sent_frag_count_.count();
00143 }
00144
00145 inline
00146 size_t
00147 artdaq::DataSenderManager::
00148 slotCount(size_t rank) const
00149 {
00150 return sent_frag_count_.slotCount(rank);
00151 }
00152 #endif //ARTDAQ_DAQRATE_DATASENDERMANAGER_HH