artdaq  v3_09_00
RoutingManagerPolicy.cc
1 #define TRACE_NAME "RoutingManagerPolicy"
2 
3 #include "artdaq/RoutingPolicies/RoutingManagerPolicy.hh"
4 #include "fhiclcpp/ParameterSet.h"
5 
7  : next_sequence_id_(1)
8  , max_token_count_(0)
9 {
10  auto receiver_ranks = ps.get<std::vector<int>>("receiver_ranks");
11  receiver_ranks_.insert(receiver_ranks.begin(), receiver_ranks.end());
12 }
13 
14 void artdaq::RoutingManagerPolicy::AddReceiverToken(int rank, unsigned new_slots_free)
15 {
16  if (receiver_ranks_.count(rank) == 0u)
17  {
18  return;
19  }
20  TLOG(10) << "AddReceiverToken BEGIN";
21  std::unique_lock<std::mutex> lk(tokens_mutex_);
22  if (new_slots_free == 1)
23  {
24  tokens_.push_back(rank);
25  }
26  else
27  {
28  // Randomly distribute multitokens through the token list
29  // Only used at start run time, so we can take the performance hit
30  for (unsigned i = 0; i < new_slots_free; ++i)
31  {
32  auto it = tokens_.begin();
33  if (!tokens_.empty())
34  {
35  std::advance(it, rand() % tokens_.size()); // NOLINT(cert-msc50-cpp)
36  }
37  tokens_.insert(it, rank);
38  }
39  }
40  if (tokens_.size() > max_token_count_)
41  {
42  max_token_count_ = tokens_.size();
43  }
44  TLOG(10) << "AddReceiverToken END";
45 }
46 
47 std::unique_ptr<std::deque<int>> artdaq::RoutingManagerPolicy::getTokensSnapshot()
48 {
49  TLOG(10) << "getTokensSnapshot BEGIN";
50  std::unique_lock<std::mutex> lk(tokens_mutex_);
51  auto out = std::make_unique<std::deque<int>>(tokens_);
52  tokens_.clear();
53  TLOG(10) << "getTokensSnapshot END";
54  return out;
55 }
56 
57 void artdaq::RoutingManagerPolicy::addUnusedTokens(std::unique_ptr<std::deque<int>> tokens)
58 {
59  std::unique_lock<std::mutex> lk(tokens_mutex_);
60  for (auto token = tokens->rbegin(); token != tokens->rend(); ++token)
61  {
62  tokens_.push_front(*token);
63  }
64  if (tokens_.size() > max_token_count_)
65  {
66  max_token_count_ = tokens_.size();
67  }
68 }
69 
71 {
72  next_sequence_id_ = 1;
73  std::unique_lock<std::mutex> lk(tokens_mutex_);
74  tokens_.clear();
75 }
void AddReceiverToken(int rank, unsigned new_slots_free)
Add a token to the token list.
void Reset()
Reset the policy, setting the next sequence ID to be used to 1, and removing any tokens.
std::unique_ptr< std::deque< int > > getTokensSnapshot()
Gets the current token list, used for building Routing Tables.
void addUnusedTokens(std::unique_ptr< std::deque< int >> tokens)
If necessary, return unused tokens to the token list, for subsequent updates.
RoutingManagerPolicy(const fhicl::ParameterSet &ps)
RoutingManagerPolicy Constructor.