DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
conffwk
src
DalRegistry.cpp
Go to the documentation of this file.
1
#include "
conffwk/Schema.hpp
"
2
#include "
conffwk/DalObject.hpp
"
3
4
namespace
dunedaq
{
5
namespace
conffwk
{
6
7
//-----------------------------------------------------------------------------
8
DalRegistry::DalRegistry
(
conffwk::Configuration
& confdb ) :
9
m_confdb
(confdb) {
10
}
11
12
//-----------------------------------------------------------------------------
13
DalRegistry::~DalRegistry
() {
14
}
15
16
// //-----------------------------------------------------------------------------
17
// std::deque<std::set<std::string>>
18
// DalRegistry::find_class_domains() {
19
20
// std::deque<std::set<std::string>> domains;
21
22
// std::deque<dunedaq::conffwk::class_t> seeds;
23
// for (const auto& c : m_confdb.get_class_list()) {
24
// auto ci = m_confdb._get_class_info(c);
25
// if (ci.p_superclasses.empty())
26
// seeds.push_back(ci);
27
// }
28
29
// for (const auto& ci : seeds) {
30
// // Make a candidate domain based using the seed subclasses
31
// std::set<std::string> class_domain;
32
// class_domain.insert(ci.p_name);
33
// class_domain.insert(ci.p_subclasses.begin(), ci.p_subclasses.end());
34
35
// // Look for overlaps with other domains
36
// std::deque<std::set<std::string>> overlapping;
37
// for (auto& d : domains) {
38
// std::set<std::string> intersection;
39
// std::set_intersection(d.begin(), d.end(), class_domain.begin(), class_domain.end(), std::inserter(intersection, intersection.begin()));
40
// // non-zero intersection, overlap found
41
// if (intersection.size() > 0) {
42
// overlapping.push_back(d);
43
// }
44
// }
45
46
// // If overlapping are found, add all overlapping to
47
// // the new domain and remove them from the domain list
48
// if (!overlapping.empty()) {
49
// for (auto& d : overlapping) {
50
// // merge the existing cluster in class_domain
51
// class_domain.insert(d.begin(), d.end());
52
// // Remove the old cluster from the list
53
// auto it = std::find(domains.begin(), domains.end(), d);
54
// if (it != domains.end()) {
55
// domains.erase(it);
56
// }
57
// }
58
// }
59
60
// domains.push_back(class_domain);
61
// }
62
63
// return domains;
64
// }
65
66
//-----------------------------------------------------------------------------
67
void
68
DalRegistry::update_class_domain_map
() {
69
70
m_class_domain_map
.clear();
71
72
auto
domains =
m_confdb
.find_class_domains();
73
// TODO: keep a local copy of the domains
74
for
(
size_t
i(0); i < domains.size(); ++i) {
75
const
auto
& dom = domains[i];
76
for
(
const
auto
& class_name : dom) {
77
m_class_domain_map
[&conffwk::DalFactory::instance().get_known_class_name_ref(class_name)] = i;
78
TLOG_DEBUG
(9) <<
" - "
<< class_name <<
" : "
<< i;
79
}
80
}
81
}
82
83
//-----------------------------------------------------------------------------
84
void
85
DalRegistry::clear
() {
86
for
(
const
auto
& [index, domain] :
m_cache_domains
) {
87
88
for
(
const
auto
& [uid, ptr] : domain.cache ) {
89
delete
ptr;
90
}
91
}
92
93
m_class_domain_map
.clear();
94
}
95
96
//-----------------------------------------------------------------------------
97
DalObject
*
98
DalRegistry::get
(
ConfigObject
&
obj
,
bool
upcast_unregistered) {
99
100
// Find the class domain of T
101
auto
it_dom =
m_class_domain_map
.find(&DalFactory::instance().get_known_class_name_ref(
obj
.class_name()));
102
103
// Class not known, this should not happen
104
if
( it_dom ==
m_class_domain_map
.end() ) {
105
throw
dunedaq::conffwk::NotFound(
ERS_HERE
,
"class"
,
obj
.class_name().c_str());
106
}
107
108
auto
& domain =
m_cache_domains
[it_dom->second];
109
110
DalObject
*& result(domain.cache[
obj
.m_impl->m_id]);
111
if
(result ==
nullptr
) {
112
113
result = DalFactory::instance().make(*
this
,
obj
, upcast_unregistered);
114
115
}
else
if
(
obj
.m_impl != result->
p_obj
.
m_impl
) {
116
117
std::lock_guard<std::mutex> scoped_lock(result->
m_mutex
);
118
result->
set
(
obj
);
// update implementation object; to be used in case if the object is re-created
119
120
}
121
122
return
result;
123
}
124
125
//-----------------------------------------------------------------------------
126
std::vector<const DalObject*>
127
DalRegistry::get
(std::vector<ConfigObject>& objs,
bool
upcast_unregistered)
128
{
129
std::vector<const DalObject*> result;
130
131
for
(
auto
&i : objs)
132
if
(
DalObject
*o = this->
get
(i,upcast_unregistered))
133
result.push_back(o);
134
135
return
result;
136
}
137
138
//-----------------------------------------------------------------------------
139
void
140
DalRegistry::update
(
141
const
std::string& class_name,
142
const
std::vector<std::string>& modified,
143
const
std::vector<std::string>& removed,
144
const
std::vector<std::string>& created) {
145
146
// Find the class domain of T
147
auto
it_dom =
m_class_domain_map
.find(&DalFactory::instance().get_known_class_name_ref(class_name));
148
149
// Class not known, this should not happen
150
if
( it_dom ==
m_class_domain_map
.end() ) {
151
throw
dunedaq::conffwk::NotFound(
ERS_HERE
,
"class"
, class_name.c_str());
152
}
153
154
// get the correct cache domain
155
auto
& domain =
m_cache_domains
[it_dom->second];
156
157
for
(
const
auto
& [uid, ptr] : domain.cache ) {
158
159
// Check if the ptr class is derived from class_name
160
m_confdb
.is_superclass_of(ptr->class_name(), class_name);
161
162
if
(!ptr)
163
continue
;
164
165
bool
update
= (
166
( std::find(modified.begin(), modified.end(), ptr->UID()) != modified.end() ) or
167
( std::find(removed.begin(), removed.end(), ptr->UID()) != removed.end() ) or
168
( std::find(created.begin(), created.end(), ptr->UID()) != created.end() )
169
);
170
171
if
(!
update
)
172
continue
;
173
174
std::lock_guard<std::mutex> scoped_lock(domain.mutex);
175
ptr->p_was_read =
false
;
176
}
177
}
178
179
180
//-----------------------------------------------------------------------------
181
void
182
DalRegistry::unread_all
() {
183
184
for
(
const
auto
& [dom_id, domain] :
m_cache_domains
) {
185
186
std::lock_guard<std::mutex> scoped_lock(domain.mutex);
187
188
for
(
const
auto
& [
id
, ptr] : domain.cache ) {
189
ptr->p_was_read =
false
;
190
}
191
192
}
193
}
194
195
196
//-----------------------------------------------------------------------------
197
void
198
DalRegistry::_rename_object
(std::string class_name, std::string old_id, std::string new_id) {
199
// Find the class domain of T
200
auto
it_dom =
m_class_domain_map
.find(&DalFactory::instance().get_known_class_name_ref(class_name));
201
202
// Class not known, this should not happen
203
if
( it_dom ==
m_class_domain_map
.end() ) {
204
throw
dunedaq::conffwk::NotFound(
ERS_HERE
, class_name.c_str(), old_id.c_str());
205
}
206
207
auto
& domain =
m_cache_domains
[it_dom->second];
208
209
auto
it = domain.cache.find(old_id);
210
if
(it == domain.cache.end())
211
return
;
212
213
domain.cache[new_id] = it->second;
214
domain.cache.erase(it);
215
216
std::lock_guard<std::mutex> scoped_lock(it->second->m_mutex);
217
it->second->p_UID = new_id;
218
219
}
220
221
222
}
// namespace conffwk
223
}
// namespace dunedaq
DalObject.hpp
ERS_HERE
#define ERS_HERE
Definition
LocalContext.hpp:141
dunedaq::conffwk::ConfigObject
Represents database objects.
Definition
ConfigObject.hpp:53
dunedaq::conffwk::ConfigObject::m_impl
ConfigObjectImpl * m_impl
Definition
ConfigObject.hpp:632
dunedaq::conffwk::DalObject
The base class for any generated DAL object.
Definition
DalObject.hpp:52
dunedaq::conffwk::DalObject::set
void set(const ConfigObject &o) noexcept
Definition
DalObject.hpp:252
dunedaq::conffwk::DalObject::m_mutex
std::mutex m_mutex
Used to protect changes of DAL object.
Definition
DalObject.hpp:115
dunedaq::conffwk::DalObject::p_obj
ConfigObject p_obj
Config object used by given template object.
Definition
DalObject.hpp:124
dunedaq::conffwk::DalRegistry::~DalRegistry
~DalRegistry()
Definition
DalRegistry.cpp:13
dunedaq::conffwk::DalRegistry::get
DalObject * get(ConfigObject &obj, bool upcast_unregistered=false)
Definition
DalRegistry.cpp:98
dunedaq::conffwk::DalRegistry::update
void update(const std::vector< std::string > &modified, const std::vector< std::string > &removed, const std::vector< std::string > &created)
Update cache of objects in case of modification.
Definition
DalRegistry.hxx:225
dunedaq::conffwk::DalRegistry::_rename_object
void _rename_object(std::string class_name, std::string old_id, std::string new_id)
Rename object of given template class (multi-thread unsafe).
Definition
DalRegistry.cpp:198
dunedaq::conffwk::DalRegistry::clear
void clear()
Clear the content of the registy.
Definition
DalRegistry.cpp:85
dunedaq::conffwk::DalRegistry::DalRegistry
DalRegistry(Configuration &confdb)
Construct a new Dal Registry object.
Definition
DalRegistry.cpp:8
dunedaq::conffwk::DalRegistry::m_cache_domains
std::unordered_map< uint, DalDomain > m_cache_domains
Definition
DalRegistry.hpp:226
dunedaq::conffwk::DalRegistry::unread_all
void unread_all()
Set the status of all objects in cache to unread.
Definition
DalRegistry.cpp:182
dunedaq::conffwk::DalRegistry::m_class_domain_map
conffwk::fmap< uint > m_class_domain_map
Definition
DalRegistry.hpp:224
dunedaq::conffwk::DalRegistry::update_class_domain_map
void update_class_domain_map()
Definition
DalRegistry.cpp:68
dunedaq::conffwk::DalRegistry::m_confdb
Configuration & m_confdb
Definition
DalRegistry.hpp:218
dunedaq::conffwk::DalRegistry::DalObject
friend class DalObject
Definition
DalRegistry.hpp:21
Schema.hpp
TLOG_DEBUG
#define TLOG_DEBUG(lvl,...)
Definition
Logging.hpp:112
conffwk.Configuration
Definition
Configuration.py:1
dunedaq::conffwk
Definition
Change.hpp:23
dunedaq
Including Qt Headers.
Definition
module.cpp:16
dunedaq::obj
msgpack::object obj
Definition
Serialization.hpp:257
Generated on
for DUNE-DAQ by
1.17.0