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