DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
trigger
src
TokenManager.cpp
Go to the documentation of this file.
1
8
9
#include "
trigger/TokenManager.hpp
"
10
#include "
trigger/LivetimeCounter.hpp
"
11
12
#include "
iomanager/IOManager.hpp
"
13
14
#include <memory>
15
#include <string>
16
17
namespace
dunedaq::trigger
{
18
19
TokenManager::TokenManager
(
const
std::string& connection_name,
20
int
initial_tokens,
21
daqdataformats::run_number_t
run_number,
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
31
m_token_receiver
=
get_iom_receiver<dfmessages::TriggerDecisionToken>
(
m_connection_name
);
32
m_token_receiver
->add_callback(std::bind(&
TokenManager::receive_token
,
this
, std::placeholders::_1));
33
}
34
35
TokenManager::~TokenManager
()
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
62
int
63
TokenManager::get_n_tokens
()
const
64
{
65
return
m_n_tokens
.load();
66
}
67
68
void
69
TokenManager::trigger_sent
(
dfmessages::trigger_number_t
trigger_number)
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) {
75
m_livetime_counter
->set_state(
LivetimeCounter::State::kDead
);
76
}
77
}
78
79
void
80
TokenManager::receive_token
(
dfmessages::TriggerDecisionToken
& token)
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) {
85
m_livetime_counter
->set_state(
LivetimeCounter::State::kLive
);
86
}
87
m_n_tokens
++;
88
TLOG_DEBUG
(1) <<
"There are now "
<<
m_n_tokens
.load() <<
" tokens available"
;
89
90
if
(token.
trigger_number
!=
dfmessages::TypeDefaults::s_invalid_trigger_number
) {
91
if
(
m_open_trigger_decisions
.count(token.
trigger_number
)) {
92
std::lock_guard<std::mutex> lk(
m_open_trigger_decisions_mutex
);
93
m_open_trigger_decisions
.erase(token.
trigger_number
);
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
IOManager.hpp
LivetimeCounter.hpp
TokenManager.hpp
dunedaq::trigger::LivetimeCounter::State::kLive
@ kLive
Definition
LivetimeCounter.hpp:22
dunedaq::trigger::LivetimeCounter::State::kDead
@ kDead
Definition
LivetimeCounter.hpp:23
dunedaq::trigger::TokenManager::m_livetime_counter
std::shared_ptr< LivetimeCounter > m_livetime_counter
Definition
TokenManager.hpp:90
dunedaq::trigger::TokenManager::m_token_receiver
std::shared_ptr< iomanager::ReceiverConcept< dfmessages::TriggerDecisionToken > > m_token_receiver
Definition
TokenManager.hpp:96
dunedaq::trigger::TokenManager::m_open_trigger_decisions
std::set< dfmessages::trigger_number_t > m_open_trigger_decisions
Definition
TokenManager.hpp:86
dunedaq::trigger::TokenManager::m_n_tokens
std::atomic< int > m_n_tokens
Definition
TokenManager.hpp:83
dunedaq::trigger::TokenManager::receive_token
void receive_token(dfmessages::TriggerDecisionToken &token)
Definition
TokenManager.cpp:80
dunedaq::trigger::TokenManager::TokenManager
TokenManager(const std::string &connection_name, int initial_tokens, daqdataformats::run_number_t run_number, std::shared_ptr< LivetimeCounter > livetime_counter)
Definition
TokenManager.cpp:19
dunedaq::trigger::TokenManager::m_run_number
daqdataformats::run_number_t m_run_number
Definition
TokenManager.hpp:89
dunedaq::trigger::TokenManager::m_open_trigger_decisions_mutex
std::mutex m_open_trigger_decisions_mutex
Definition
TokenManager.hpp:87
dunedaq::trigger::TokenManager::get_n_tokens
int get_n_tokens() const
Definition
TokenManager.cpp:63
dunedaq::trigger::TokenManager::trigger_sent
void trigger_sent(dfmessages::trigger_number_t)
Definition
TokenManager.cpp:69
dunedaq::trigger::TokenManager::m_open_trigger_time
std::chrono::time_point< std::chrono::steady_clock > m_open_trigger_time
Definition
TokenManager.hpp:93
dunedaq::trigger::TokenManager::~TokenManager
virtual ~TokenManager()
Definition
TokenManager.cpp:35
dunedaq::trigger::TokenManager::m_connection_name
std::string m_connection_name
Definition
TokenManager.hpp:78
now
static int64_t now()
Definition
kafka_opmon_consumer.cxx:44
TLOG_DEBUG
#define TLOG_DEBUG(lvl,...)
Definition
Logging.hpp:112
dunedaq::daqdataformats::run_number_t
uint32_t run_number_t
Definition
Types.hpp:17
dunedaq::dfmessages::trigger_number_t
daqdataformats::trigger_number_t trigger_number_t
Copy daqdataformats::trigger_number_t.
Definition
Types.hpp:35
dunedaq::trigger
Definition
AlgorithmPlugins.hpp:24
dunedaq::get_iom_receiver
static std::shared_ptr< iomanager::ReceiverConcept< Datatype > > get_iom_receiver(iomanager::ConnectionId const &id)
Definition
IOManager.hxx:178
dunedaq::daqdataformats::TypeDefaults::s_invalid_trigger_number
static constexpr trigger_number_t s_invalid_trigger_number
Definition
Types.hpp:48
dunedaq::dfmessages::TriggerDecisionToken
Represents a message indicating that the DataFlow has one additional buffer available.
Definition
TriggerDecisionToken.hpp:24
dunedaq::dfmessages::TriggerDecisionToken::run_number
run_number_t run_number
The run number that this token corresponds to.
Definition
TriggerDecisionToken.hpp:25
dunedaq::dfmessages::TriggerDecisionToken::trigger_number
trigger_number_t trigger_number
An optional trigger number that this token represents completion of.
Definition
TriggerDecisionToken.hpp:26
Generated on
for DUNE-DAQ by
1.17.0