DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
cmdlib
src
CommandFacility.cpp
Go to the documentation of this file.
1
8
#include "
cmdlib/CommandFacility.hpp
"
9
#include "
cmdlib/Issues.hpp
"
10
#include "
logging/Logging.hpp
"
11
12
#include <atomic>
13
#include <chrono>
14
#include <functional>
15
#include <future>
16
#include <string>
17
#include <utility>
18
19
using namespace
dunedaq::cmdlib
;
20
21
CommandFacility::~CommandFacility
()
22
{
23
if
(
m_active
.load()) {
24
m_active
.store(
false
);
25
if
(
m_executor
.joinable()) {
26
m_executor
.join();
27
}
28
}
29
}
30
31
void
32
CommandFacility::set_commanded
(
CommandedObject
& commanded, std::string name)
33
{
34
if
(
m_commanded_object
==
nullptr
) {
35
m_name
= name;
36
m_commanded_object
= &commanded;
37
m_command_callback
=
38
std::bind(&
CommandFacility::handle_command
,
this
, std::placeholders::_1, std::placeholders::_2);
39
m_active
.store(
true
);
40
m_executor
= std::thread(&
CommandFacility::executor
,
this
);
41
}
else
{
42
ers::error
(CommandFacilityInitialization(
ERS_HERE
,
"set_commanded shall be called once."
));
43
}
44
}
45
46
void
47
CommandFacility::execute_command
(
const
cmdobj_t
&
cmd
,
cmd::CommandReply
meta)
48
{
49
auto
execfut = std::async(std::launch::deferred,
m_command_callback
, std::move(
cmd
), std::move(meta));
50
m_completion_queue
.push(std::move(execfut));
51
}
52
53
void
54
CommandFacility::handle_command
(
const
cmdobj_t
&
cmd
,
cmd::CommandReply
meta)
55
{
56
try
{
57
m_commanded_object
->
execute
(
cmd
);
58
meta.
success
=
true
;
59
meta.
result
=
"OK"
;
60
meta.
appname
=
m_name
;
61
}
catch
(
const
ers::Issue
& ei) {
62
meta.
success
=
false
;
63
meta.
result
= ei.
what
();
64
meta.
appname
=
m_name
;
65
ers::error
(
CommandExecutionFailed
(
ERS_HERE
,
"Caught ers::Issue"
, ei));
66
}
catch
(
const
std::exception& exc) {
67
meta.
success
=
false
;
68
meta.
result
= exc.what();
69
meta.
appname
=
m_name
;
70
ers::error
(
CommandExecutionFailed
(
ERS_HERE
,
"Caught std::exception"
, exc));
71
}
catch
(...) {
// NOLINT JCF Jan-27-2021 violates letter of the law but not the spirit
72
meta.
success
=
false
;
73
meta.
result
=
"Caught unknown exception"
;
74
meta.
appname
=
m_name
;
75
ers::error
(
CommandExecutionFailed
(
ERS_HERE
, meta.
result
));
76
}
77
completion_callback
(
cmd
, meta);
78
}
79
80
void
81
CommandFacility::executor
()
82
{
83
std::future<void> fut;
84
while
(
m_active
.load()) {
85
if
(
m_completion_queue
.empty()) {
86
std::this_thread::sleep_for(std::chrono::milliseconds(10));
87
}
else
{
88
bool
success =
m_completion_queue
.try_pop(fut);
89
if
(!success) {
90
ers::error
(CompletionQueueIssue(
ERS_HERE
,
"Can't get from completion queue."
));
91
}
else
{
92
fut.wait();
// trigger execution
93
}
94
}
95
}
96
}
CommandFacility.hpp
ERS_HERE
#define ERS_HERE
Definition
LocalContext.hpp:127
dunedaq::cmdlib::CommandFacility::handle_command
void handle_command(const cmdobj_t &cmd, cmd::CommandReply meta)
The glue between commanded and completion callback.
Definition
CommandFacility.cpp:54
dunedaq::cmdlib::CommandFacility::completion_callback
virtual void completion_callback(const cmdobj_t &cmd, cmd::CommandReply &meta)=0
Must be implemented to handling the results of the commands.
dunedaq::cmdlib::CommandFacility::~CommandFacility
virtual ~CommandFacility()
Definition
CommandFacility.cpp:21
dunedaq::cmdlib::CommandFacility::executor
void executor()
Definition
CommandFacility.cpp:81
dunedaq::cmdlib::CommandFacility::m_commanded_object
CommandedObject * m_commanded_object
Commanded Object to run execute with received commands as parameters.
Definition
CommandFacility.hpp:82
dunedaq::cmdlib::CommandFacility::m_completion_queue
CompletionQueue m_completion_queue
Definition
CommandFacility.hpp:86
dunedaq::cmdlib::CommandFacility::m_executor
std::thread m_executor
Definition
CommandFacility.hpp:95
dunedaq::cmdlib::CommandFacility::m_name
std::string m_name
name of the commanded object
Definition
CommandFacility.hpp:73
dunedaq::cmdlib::CommandFacility::m_active
std::atomic< bool > m_active
Single thrad is responsible to trigger tasks.
Definition
CommandFacility.hpp:93
dunedaq::cmdlib::CommandFacility::m_command_callback
CommandCallback m_command_callback
Definition
CommandFacility.hpp:90
dunedaq::cmdlib::CommandFacility::set_commanded
void set_commanded(CommandedObject &commanded, std::string name)
Meant to be called once from main.
Definition
CommandFacility.cpp:32
dunedaq::cmdlib::CommandFacility::execute_command
void execute_command(const cmdobj_t &cmd, cmd::CommandReply meta)
Feed commands from the implementation.
Definition
CommandFacility.cpp:47
dunedaq::cmdlib::CommandedObject
Interface needed by commanded objects in the DAQ.
Definition
CommandedObject.hpp:21
dunedaq::cmdlib::CommandedObject::execute
virtual void execute(const cmdobj_t &command)=0
Pure virtual execute member.
ers::Issue
Base class for any user define issue.
Definition
Issue.hpp:76
ers::Issue::what
const char * what() const noexcept
General cause of the issue.
Definition
Issue.hpp:133
Issues.hpp
Logging.hpp
dunedaq::cmdlib::cmd
Definition
Nljs.hpp:15
dunedaq::cmdlib
Definition
Nljs.hpp:15
dunedaq::cmdlib::cmdobj_t
nlohmann::json cmdobj_t
Definition
CommandedObject.hpp:15
dunedaq::CommandExecutionFailed
Unsupported std::string uri CommandExecutionFailed
Definition
Issues.hpp:62
ers::error
void error(const Issue &issue)
Definition
ers.hpp:101
dunedaq::cmdlib::cmd::CommandReply
Definition
Structs.hpp:45
dunedaq::cmdlib::cmd::CommandReply::result
Result result
Definition
Structs.hpp:51
dunedaq::cmdlib::cmd::CommandReply::appname
AppId appname
Definition
Structs.hpp:54
dunedaq::cmdlib::cmd::CommandReply::success
IsOk success
Definition
Structs.hpp:48
Generated on
for DUNE-DAQ by
1.18.0