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
00054 explicit DataSenderManager(const fhicl::ParameterSet& ps);
00055
00059 virtual ~DataSenderManager();
00060
00066 std::pair<int, TransferInterface::CopyStatus> sendFragment(Fragment&& frag);
00067
00072 size_t count() const;
00073
00079 size_t slotCount(size_t rank) const;
00080
00085 size_t destinationCount() const { return destinations_.size(); }
00086
00091 std::set<int> enabled_destinations() const { return enabled_destinations_; }
00092
00097 size_t GetRoutingTableEntryCount() const;
00098 private:
00099
00100
00101 int calcDest_(Fragment::sequence_id_t) const;
00102
00103 void setupTableListener_();
00104
00105 void startTableReceiverThread_();
00106
00107 void receiveTableUpdatesLoop_();
00108 private:
00109
00110 std::map<int, std::unique_ptr<artdaq::TransferInterface>> destinations_;
00111 std::set<int> enabled_destinations_;
00112
00113 detail::FragCounter sent_frag_count_;
00114
00115 bool broadcast_sends_;
00116 bool non_blocking_mode_;
00117 size_t send_timeout_us_;
00118 size_t send_retry_count_;
00119
00120 bool use_routing_master_;
00121 detail::RoutingMasterMode routing_master_mode_;
00122 std::atomic<bool> should_stop_;
00123 int table_port_;
00124 std::string table_address_;
00125 int ack_port_;
00126 std::string ack_address_;
00127 struct sockaddr_in ack_addr_;
00128 int ack_socket_;
00129 int table_socket_;
00130 std::map<Fragment::sequence_id_t, int> routing_table_;
00131 mutable std::mutex routing_mutex_;
00132 boost::thread routing_thread_;
00133 mutable std::atomic<size_t> routing_wait_time_;
00134
00135 int routing_timeout_ms_;
00136 int routing_retry_count_;
00137 };
00138
00139 inline
00140 size_t
00141 artdaq::DataSenderManager::
00142 count() const
00143 {
00144 return sent_frag_count_.count();
00145 }
00146
00147 inline
00148 size_t
00149 artdaq::DataSenderManager::
00150 slotCount(size_t rank) const
00151 {
00152 return sent_frag_count_.slotCount(rank);
00153 }
00154 #endif //ARTDAQ_DAQRATE_DATASENDERMANAGER_HH