00001 #include "artdaq/Application/Routing/RoutingMasterPolicy.hh"
00002 #include "fhiclcpp/ParameterSet.h"
00003
00004 artdaq::RoutingMasterPolicy::RoutingMasterPolicy(fhicl::ParameterSet ps)
00005 : next_sequence_id_(0)
00006 , tokens_()
00007 , max_token_count_(0)
00008 {
00009 auto receiver_ranks = ps.get<std::vector<int>>("receiver_ranks");
00010 receiver_ranks_.insert(receiver_ranks.begin(), receiver_ranks.end());
00011 }
00012
00013 void artdaq::RoutingMasterPolicy::AddReceiverToken(int rank, unsigned new_slots_free)
00014 {
00015 if (!receiver_ranks_.count(rank)) return;
00016 TLOG_ARB(10, "RoutingMasterPolicy") << "AddReceiverToken BEGIN" << TLOG_ENDL;
00017 std::unique_lock<std::mutex> lk(tokens_mutex_);
00018 if (new_slots_free == 1)
00019 {
00020 tokens_.push_back(rank);
00021 }
00022 else
00023 {
00024
00025
00026 for (unsigned i = 0; i < new_slots_free; ++i)
00027 {
00028 auto it = tokens_.begin();
00029 if(tokens_.size()) std::advance(it, rand() % tokens_.size());
00030 tokens_.insert(it, rank);
00031 }
00032 }
00033 if (tokens_.size() > max_token_count_) max_token_count_ = tokens_.size();
00034 TLOG_ARB(10, "RoutingMasterPolicy") << "AddReceiverToken END" << TLOG_ENDL;
00035 }
00036
00037 std::unique_ptr<std::deque<int>> artdaq::RoutingMasterPolicy::getTokensSnapshot()
00038 {
00039 TLOG_ARB(10, "RoutingMasterPolicy" ) << "getTokensSnapshot BEGIN" << TLOG_ENDL;
00040 std::unique_lock<std::mutex> lk(tokens_mutex_);
00041 auto out = std::make_unique<std::deque<int>>(tokens_);
00042 tokens_.clear();
00043 TLOG_ARB(10, "RoutingMasterPolicy") << "getTokensSnapshot END" << TLOG_ENDL;
00044 return out;
00045 }
00046
00047 void artdaq::RoutingMasterPolicy::addUnusedTokens(std::unique_ptr<std::deque<int>> tokens)
00048 {
00049 std::unique_lock<std::mutex> lk(tokens_mutex_);
00050 for (auto token = tokens.get()->rbegin(); token != tokens.get()->rend(); ++token)
00051 {
00052 tokens_.push_front(*token);
00053 }
00054 if (tokens_.size() > max_token_count_) max_token_count_ = tokens_.size();
00055 }