00001 #ifndef artdaq_Application_Routing_RoutingMasterPolicy_hh 00002 #define artdaq_Application_Routing_RoutingMasterPolicy_hh 00003 00004 #include "artdaq/DAQdata/Globals.hh" 00005 #include "artdaq/DAQrate/detail/RoutingPacket.hh" 00006 #include "artdaq-core/Data/Fragment.hh" 00007 00008 #include "fhiclcpp/fwd.h" 00009 #include <mutex> 00010 #include <deque> 00011 #include <unordered_set> 00012 00013 namespace artdaq 00014 { 00018 class RoutingMasterPolicy 00019 { 00020 public: 00030 explicit RoutingMasterPolicy(fhicl::ParameterSet ps); 00034 virtual ~RoutingMasterPolicy() = default; 00035 00042 virtual detail::RoutingPacket GetCurrentTable() = 0; 00043 00048 size_t GetReceiverCount() const { return receiver_ranks_.size(); } 00049 00054 size_t GetMaxNumberOfTokens() const { return max_token_count_; } 00055 00061 void AddReceiverToken(int rank, unsigned new_slots_free); 00062 00066 void Reset() { next_sequence_id_ = 0; } 00067 protected: 00068 Fragment::sequence_id_t next_sequence_id_; 00069 00070 std::unique_ptr<std::deque<int>> getTokensSnapshot(); 00071 void addUnusedTokens(std::unique_ptr<std::deque<int>> tokens); 00072 private: 00073 mutable std::mutex tokens_mutex_; 00074 std::unordered_set<int> receiver_ranks_; 00075 std::deque<int> tokens_; 00076 size_t max_token_count_; 00077 00078 }; 00079 } 00080 00081 00082 #endif // artdaq_Application_Routing_RoutingMasterPolicy_hh