DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TokenManager.cpp
Go to the documentation of this file.
1
11
13
14#include <memory>
15#include <string>
16
17namespace dunedaq::trigger {
18
19TokenManager::TokenManager(const std::string& connection_name,
20 int initial_tokens,
22 std::shared_ptr<LivetimeCounter> livetime_counter)
23 : m_connection_name(connection_name)
24 , m_n_tokens(initial_tokens)
25 , m_run_number(run_number)
26 , m_livetime_counter(livetime_counter)
27 , m_token_receiver(nullptr)
28{
29 m_open_trigger_time = std::chrono::steady_clock::now();
30
32 m_token_receiver->add_callback(std::bind(&TokenManager::receive_token, this, std::placeholders::_1));
33}
34
36{
37 m_token_receiver->remove_callback();
38
39 if (!m_open_trigger_decisions.empty()) {
40
41 auto now = std::chrono::steady_clock::now();
42 if (std::chrono::duration_cast<std::chrono::milliseconds>(now - m_open_trigger_time) >
43 std::chrono::milliseconds(3000)) {
44 std::ostringstream o;
45 o << "Open Trigger Decisions: [";
46 { // Scope for lock_guard
47 bool first = true;
48 std::lock_guard<std::mutex> lk(m_open_trigger_decisions_mutex);
49 for (auto& td : m_open_trigger_decisions) {
50 if (!first)
51 o << ", ";
52 o << td;
53 first = false;
54 }
55 o << "]";
56 }
57 TLOG_DEBUG(0) << o.str();
58 }
59 }
60}
61
62int
64{
65 return m_n_tokens.load();
66}
67
68void
70{
71 std::lock_guard<std::mutex> lk(m_open_trigger_decisions_mutex);
72 m_open_trigger_decisions.insert(trigger_number);
73 m_n_tokens--;
74 if (m_n_tokens.load() == 0) {
76 }
77}
78
79void
81{
82 TLOG_DEBUG(1) << "Received token with run number " << token.run_number << ", current run number " << m_run_number;
83 if (token.run_number == m_run_number) {
84 if (m_n_tokens.load() == 0) {
86 }
87 m_n_tokens++;
88 TLOG_DEBUG(1) << "There are now " << m_n_tokens.load() << " tokens available";
89
92 std::lock_guard<std::mutex> lk(m_open_trigger_decisions_mutex);
94 TLOG_DEBUG(1) << "Token indicates that trigger decision " << token.trigger_number
95 << " has been completed. There are now " << m_open_trigger_decisions.size()
96 << " triggers in flight";
97 } else {
98 // ERS warning: received token for trigger number I don't recognize
99 }
100 }
101 }
102}
103
104} // namespace dunedaq::trigger
static constexpr trigger_number_t s_invalid_trigger_number
An invalid trigger number.
Definition Types.hpp:59
std::shared_ptr< LivetimeCounter > m_livetime_counter
std::shared_ptr< iomanager::ReceiverConcept< dfmessages::TriggerDecisionToken > > m_token_receiver
std::set< dfmessages::trigger_number_t > m_open_trigger_decisions
void receive_token(dfmessages::TriggerDecisionToken &token)
TokenManager(const std::string &connection_name, int initial_tokens, daqdataformats::run_number_t run_number, std::shared_ptr< LivetimeCounter > livetime_counter)
daqdataformats::run_number_t m_run_number
void trigger_sent(dfmessages::trigger_number_t)
std::chrono::time_point< std::chrono::steady_clock > m_open_trigger_time
static int64_t now()
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
uint32_t run_number_t
Type used to represent run number.
Definition Types.hpp:20
daqdataformats::trigger_number_t trigger_number_t
Copy daqdataformats::trigger_number_t.
Definition Types.hpp:35
static std::shared_ptr< iomanager::ReceiverConcept< Datatype > > get_iom_receiver(iomanager::ConnectionId const &id)
Represents a message indicating that the DataFlow has one additional buffer available.
run_number_t run_number
The run number that this token corresponds to.
trigger_number_t trigger_number
An optional trigger number that this token represents completion of.