ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Event
EventContainers
src
InternalOnline.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
EventContainers/InternalOnline.h
"
6
#include <algorithm>
7
#include "
EventContainers/IDC_WriteHandleBase.h
"
8
#include "
CxxUtils/checker_macros.h
"
9
#include "
EventContainers/IdentifiableCacheBase.h
"
10
11
using namespace
EventContainers
;
12
typedef
I_InternalIDC::InternalConstItr
InternalConstItr
;
13
14
15
InternalOnline::InternalOnline
(
EventContainers::IdentifiableCacheBase
*cache) :
m_cacheLink
(cache),
16
m_mask(cache->
fullSize
()), m_waitNeeded(false) {}
17
18
const
std::vector < I_InternalIDC::hashPair >&
InternalOnline::getAllHashPtrPair
()
const
{
19
if
(m_waitNeeded.load(std::memory_order_acquire))
wait
();
20
return
m_map;
21
}
22
23
24
InternalConstItr
25
InternalOnline::cend
()
const
{
26
if
(m_waitNeeded.load(std::memory_order_acquire))
wait
();
27
return
m_map.cend();
28
}
29
30
InternalConstItr
31
InternalOnline::cbegin
()
const
{
32
if
(m_waitNeeded.load(std::memory_order_acquire))
wait
();
33
return
m_map.cbegin();
34
}
35
36
InternalConstItr
InternalOnline::indexFind
(
IdentifierHash
hashId )
const
{
37
if
(m_waitNeeded.load(std::memory_order_acquire))
wait
();
38
auto
itr = std::lower_bound( m_map.begin(), m_map.end(), hashId.
value
(), [](
hashPair
&lhs,
IdentifierHash::value_type
rhs) ->
bool
{ return lhs.first < rhs; } );
39
if
(itr!= m_map.end() && itr->first==hashId)
return
itr;
40
return
m_map.end();
41
}
42
43
void
InternalOnline::wait
()
const
{
44
//lockguard to protect m_waitlist from multiple wait calls
45
std::scoped_lock
lock
(m_waitMutex);
46
if
(m_waitNeeded.load(std::memory_order_acquire) ==
false
)
return
;
47
using namespace
EventContainers
;
48
const
void
* ABORTstate = std::bit_cast<const void*>(
IdentifiableCacheBase::ABORTEDflag
);
49
while
(!m_waitlist.empty()) {
50
IdentifierHash
hash = m_waitlist.back();
51
EventContainers::IdentifiableCacheBase
* cacheLink
ATLAS_THREAD_SAFE
=
m_cacheLink
;
52
const
void
* ptr = cacheLink->waitFor(hash);
53
if
(ptr == ABORTstate) {
54
m_mask.unset(hash);
55
}
56
m_waitlist.pop_back();
57
}
58
m_map.clear();
59
m_mask.forEachSetBit([
this
](
size_t
index
) {
60
const
void
* ptr =
m_cacheLink
->m_vec[
index
].load(std::memory_order_relaxed);
//acquire sync is done by m_waitNeeded
61
m_map.emplace_back(
index
, ptr);
62
});
63
//Full sync to release m_map and acquire pointers retrieved
64
//Probably done by the lock descoping but this is easier to read.
65
m_waitNeeded.store(
false
, std::memory_order_seq_cst);
66
}
67
68
bool
InternalOnline::tryAddFromCache
(
IdentifierHash
hashId,
EventContainers::IDC_WriteHandleBase
&
lock
) {
69
int
flag =
m_cacheLink
->tryLock(hashId,
lock
, m_waitlist);
70
//Relaxed since this should not be running in threaded situation.
71
if
(!m_waitlist.empty()) m_waitNeeded.store(
true
, std::memory_order_relaxed);
72
if
(flag > 0) {
73
if
(flag!=3){
74
m_mask.set(hashId);
75
m_waitNeeded.store(
true
, std::memory_order_relaxed);
76
}
77
return
true
;
78
}
79
return
false
;
80
}
81
82
bool
InternalOnline::tryAddFromCache
(
IdentifierHash
hashId)
83
{
84
auto
ptr =
m_cacheLink
->find(hashId);
85
if
(ptr==
nullptr
) {
86
return
false
;
87
}
88
m_mask.set(hashId);
89
m_waitNeeded.store(
true
, std::memory_order_relaxed);
90
return
true
;
91
}
92
93
std::vector<IdentifierHash>
InternalOnline::getAllCurrentHashes
()
const
{
94
if
(m_waitNeeded.load(std::memory_order_acquire))
wait
();
95
std::vector<IdentifierHash> ids;
96
ids.reserve(m_map.size());
97
for
(
auto
&
x
: m_map) {
98
ids.emplace_back(
x
.first);
99
}
100
return
ids;
101
}
102
103
size_t
InternalOnline::numberOfCollections
()
const
{
104
if
(m_waitNeeded.load(std::memory_order_acquire))
wait
();
105
return
m_map.size();
106
}
107
108
void
InternalOnline::resetMask
() {
109
if
(m_waitNeeded.load(std::memory_order_relaxed))
wait
();
110
m_mask.clear();
111
m_map.clear();
112
m_waitNeeded.store(
true
, std::memory_order_relaxed);
113
}
114
115
StatusCode
InternalOnline::fetchOrCreate
(
IdentifierHash
hashId) {
116
if
(!
m_cacheLink
->IMakerPresent()) [[
unlikely
]]
return
StatusCode::FAILURE;
117
auto
ptr =
m_cacheLink
->get(hashId);
118
if
(ptr) { m_mask.set(hashId); m_waitNeeded.store(
true
, std::memory_order_relaxed); }
119
return
StatusCode::SUCCESS;
120
}
121
122
StatusCode
InternalOnline::fetchOrCreate
(
const
std::vector<IdentifierHash> &
/*hashIds*/
) {
123
throw
std::runtime_error(
"Not implemented"
);
124
// if (!m_cacheLink->IMakerPresent()) [[unlikely]] return StatusCode::FAILURE;
125
// m_cacheLink->createSet(hashIds, m_mask);
126
// return StatusCode::SUCCESS;
127
}
128
129
130
bool
InternalOnline::insert
(
IdentifierHash
hashId,
const
void
* ptr) {
131
std::pair<bool, const void*> cacheinserted =
m_cacheLink
->add(hashId, ptr);
132
m_mask.set(hashId);
//it wasn't added it is already present therefore mask could be true
133
m_waitNeeded.store(
true
, std::memory_order_relaxed);
134
return
ptr == cacheinserted.second;
135
}
136
137
const
void
*
InternalOnline::findIndexPtr
(
IdentifierHash
hashId)
const
noexcept
{
138
if
(hashId < m_mask.size() and m_mask.test(hashId)) {
139
EventContainers::IdentifiableCacheBase
* cacheLink
ATLAS_THREAD_SAFE
=
m_cacheLink
;
140
return
cacheLink->findWait(hashId);
141
}
142
return
nullptr
;
143
}
144
145
StatusCode
InternalOnline::addLock
(
IdentifierHash
hashId,
const
void
* ptr) {
146
std::pair<bool, const void*> added =
m_cacheLink
->addLock(hashId, ptr);
147
if
(!added.first) [[
unlikely
]] {
148
throw
std::runtime_error(
"IDC WARNING Deletion shouldn't occur in addLock paradigm"
);
149
}
150
m_mask.set(hashId);
//it wasn't added it is already present therefore mask could be true
151
m_waitNeeded.store(
true
, std::memory_order_relaxed);
152
return
StatusCode::SUCCESS;
153
}
154
155
void
*
InternalOnline::removeCollection
(
IdentifierHash
) {
156
throw
std::runtime_error(
"Do not remove things from an online IDC"
);
157
}
158
159
void
InternalOnline::destructor
(
deleter_f
*)
noexcept
{
160
//deliberately empty
161
}
162
163
void
InternalOnline::cleanUp
(
deleter_f
*)
noexcept
{
164
resetMask
();
165
}
IDC_WriteHandleBase.h
lock
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
IdentifiableCacheBase.h
InternalConstItr
I_InternalIDC::InternalConstItr InternalConstItr
Definition
InternalOffline.cxx:10
InternalOnline.h
x
#define x
checker_macros.h
Define macros for attributes used to control the static checker.
EventContainers::IDC_WriteHandleBase
Definition
IDC_WriteHandleBase.h:13
EventContainers::I_InternalIDC::InternalConstItr
std::vector< hashPair >::const_iterator InternalConstItr
Definition
I_InternalIDC.h:38
EventContainers::I_InternalIDC::hashPair
EventContainers::hashPair< void > hashPair
Definition
I_InternalIDC.h:37
EventContainers::I_InternalIDC::deleter_f
void deleter_f(const void *p)
Definition
I_InternalIDC.h:14
EventContainers::IdentifiableCacheBase
Definition
IdentifiableCacheBase.h:23
EventContainers::IdentifiableCacheBase::ABORTEDflag
static constexpr uintptr_t ABORTEDflag
Definition
IdentifiableCacheBase.h:28
EventContainers::InternalOnline::getAllCurrentHashes
virtual std::vector< IdentifierHash > getAllCurrentHashes() const override
Definition
InternalOnline.cxx:93
EventContainers::InternalOnline::indexFind
virtual InternalConstItr indexFind(IdentifierHash hashId) const override
Definition
InternalOnline.cxx:36
EventContainers::InternalOnline::ATLAS_THREAD_SAFE
std::vector< IdentifierHash > m_waitlist ATLAS_THREAD_SAFE
Definition
InternalOnline.h:52
EventContainers::InternalOnline::addLock
virtual StatusCode addLock(IdentifierHash hashId, const void *ptr) override
Definition
InternalOnline.cxx:145
EventContainers::InternalOnline::insert
virtual bool insert(IdentifierHash hashId, const void *ptr) override
Definition
InternalOnline.cxx:130
EventContainers::InternalOnline::findIndexPtr
virtual const void * findIndexPtr(IdentifierHash hashId) const noexcept override
Definition
InternalOnline.cxx:137
EventContainers::InternalOnline::wait
virtual void wait() const override
Definition
InternalOnline.cxx:43
EventContainers::InternalOnline::cleanUp
virtual void cleanUp(deleter_f *) noexcept override
Definition
InternalOnline.cxx:163
EventContainers::InternalOnline::resetMask
void resetMask()
Definition
InternalOnline.cxx:108
EventContainers::InternalOnline::tryAddFromCache
virtual bool tryAddFromCache(IdentifierHash hashId, EventContainers::IDC_WriteHandleBase &lock) override
Definition
InternalOnline.cxx:68
EventContainers::InternalOnline::fullSize
virtual size_t fullSize() const noexcept override
Definition
InternalOnline.h:41
EventContainers::InternalOnline::fetchOrCreate
virtual StatusCode fetchOrCreate(IdentifierHash hashId) override
Definition
InternalOnline.cxx:115
EventContainers::InternalOnline::destructor
virtual void destructor(deleter_f *) noexcept override
Definition
InternalOnline.cxx:159
EventContainers::InternalOnline::removeCollection
virtual void * removeCollection(IdentifierHash hashId) override
Definition
InternalOnline.cxx:155
EventContainers::InternalOnline::getAllHashPtrPair
virtual const std::vector< hashPair > & getAllHashPtrPair() const override
Definition
InternalOnline.cxx:18
EventContainers::InternalOnline::cbegin
virtual InternalConstItr cbegin() const override
Definition
InternalOnline.cxx:31
EventContainers::InternalOnline::InternalOnline
InternalOnline(EventContainers::IdentifiableCacheBase *cache)
Definition
InternalOnline.cxx:15
EventContainers::InternalOnline::cend
virtual InternalConstItr cend() const override
Definition
InternalOnline.cxx:25
EventContainers::InternalOnline::numberOfCollections
virtual size_t numberOfCollections() const override
Definition
InternalOnline.cxx:103
EventContainers::InternalOnline::m_cacheLink
EventContainers::IdentifiableCacheBase * m_cacheLink
Definition
InternalOnline.h:51
IdentifierHash
This is a "hash" representation of an Identifier.
Definition
IdentifierHash.h:25
IdentifierHash::value
constexpr value_type value() const
IdentifierHash::value_type
unsigned int value_type
Definition
IdentifierHash.h:27
EventContainers
Definition
T_AthenaPoolCreateFuncs.h:33
index
Definition
index.py:1
unlikely
#define unlikely(x)
Definition
pythonic_coracool.cxx:9
Generated on
for ATLAS Offline Software by
1.17.0