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