ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Event
EventContainers
src
InternalOfflineFast.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/InternalOfflineFast.h
"
6
#include <algorithm>
7
#include "
EventContainers/IDC_WriteHandleBase.h
"
8
9
using namespace
EventContainers
;
10
typedef
I_InternalIDC::InternalConstItr
InternalConstItr
;
11
InternalOfflineFast::InternalOfflineFast
(
size_t
max
) :
m_fullMap
(
max
, nullptr), m_needsupdate(false) {}
12
13
14
bool
InternalOfflineFast::tryAddFromCache
(
IdentifierHash
hash,
EventContainers::IDC_WriteHandleBase
&) {
15
return
m_fullMap
[hash] !=
nullptr
;
16
}
17
18
bool
InternalOfflineFast::tryAddFromCache
(
IdentifierHash
hash)
19
{
20
return
m_fullMap
[hash] !=
nullptr
;
21
}
22
23
void
InternalOfflineFast::wait
()
const
{
24
std::scoped_lock
lock
(m_waitMutex);
25
if
(m_needsupdate.load(std::memory_order_acquire) ==
false
)
return
;
26
m_map.clear();
27
for
(
size_t
i=0 ;i <
m_fullMap
.size(); ++i){
28
if
(
m_fullMap
[i]) m_map.emplace_back(i,
m_fullMap
[i]);
29
}
30
m_map.shrink_to_fit();
31
m_needsupdate.store(
false
, std::memory_order_release);
32
}
33
34
std::vector<IdentifierHash>
InternalOfflineFast::getAllCurrentHashes
()
const
{
35
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
36
std::vector<IdentifierHash> ids;
37
ids.reserve(m_map.size());
38
for
(
auto
&
x
: m_map) {
39
ids.emplace_back(
x
.first);
40
}
41
return
ids;
42
}
43
44
InternalConstItr
45
InternalOfflineFast::cend
()
const
{
46
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
47
return
m_map.cend();
48
}
49
50
const
std::vector < I_InternalIDC::hashPair >&
InternalOfflineFast::getAllHashPtrPair
()
const
{
51
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
52
return
m_map;
53
}
54
55
InternalConstItr
56
InternalOfflineFast::cbegin
()
const
{
57
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
58
return
m_map.cbegin();
59
}
60
61
InternalConstItr
InternalOfflineFast::indexFind
(
IdentifierHash
hashId )
const
{
62
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
63
auto
itr = std::lower_bound( m_map.cbegin(), m_map.cend(), hashId.
value
(), [](
const
hashPair
&lhs,
IdentifierHash::value_type
rhs) ->
bool
{ return lhs.first < rhs; } );
64
if
(itr!= m_map.cend() && itr->first==hashId)
return
itr;
65
return
m_map.cend();
66
}
67
68
size_t
InternalOfflineFast::numberOfCollections
()
const
{
69
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
70
return
m_map.size();
71
}
72
73
void
InternalOfflineFast::cleanUp
(
deleter_f
* deleter)
noexcept
{
74
if
(!m_needsupdate.load(std::memory_order_acquire)) {
75
for
(
const
auto
&
x
: m_map) { deleter(
x
.second);
m_fullMap
[
x
.first] =
nullptr
; }
76
if
(!m_map.empty()) m_needsupdate.store(
true
, std::memory_order_relaxed);
77
}
78
else
{
79
for
(
size_t
i=0 ;i <
m_fullMap
.size(); ++i){
80
if
(
m_fullMap
[i]) { deleter(
m_fullMap
[i]);
m_fullMap
[i] =
nullptr
; }
81
}
82
}
83
m_map.clear();
84
}
85
86
bool
InternalOfflineFast::insert
(
IdentifierHash
hashId,
const
void
* ptr) {
87
if
(
m_fullMap
[hashId]!=
nullptr
)
return
false
;
//already in
88
m_fullMap
[hashId] = ptr;
89
m_needsupdate.store(
true
, std::memory_order_relaxed);
90
return
true
;
91
}
92
93
const
void
*
InternalOfflineFast::findIndexPtr
(
IdentifierHash
hashId)
const
noexcept
{
94
if
(hashId >=
m_fullMap
.size())
return
nullptr
;
95
return
m_fullMap
[hashId];
96
}
97
98
StatusCode
InternalOfflineFast::addLock
(
IdentifierHash
hashId,
const
void
* ptr) {
99
bool
added =
insert
(hashId, ptr);
100
if
(!added) {
101
throw
std::runtime_error(
"IDC WARNING Deletion shouldn't occur in addLock paradigm"
);
102
}
103
return
StatusCode::SUCCESS;
104
}
105
106
void
*
InternalOfflineFast::removeCollection
(
IdentifierHash
hashId ) {
107
void
* ptr
ATLAS_THREAD_SAFE
=
const_cast<
void
*
>
(
m_fullMap
[hashId]);
108
m_fullMap
[hashId] =
nullptr
;
109
m_needsupdate.store(
true
, std::memory_order_relaxed);
110
return
ptr;
111
}
112
113
StatusCode
InternalOfflineFast::fetchOrCreate
(
IdentifierHash
) {
114
throw
std::runtime_error(
"Not implemented in offline mode"
);
115
}
116
StatusCode
InternalOfflineFast::fetchOrCreate
(
const
std::vector<IdentifierHash>&)
117
{
118
throw
std::runtime_error(
"Not implemented in offline mode"
);
119
}
120
121
void
InternalOfflineFast::destructor
(
deleter_f
* deleter)
noexcept
{
122
if
(!m_needsupdate.load(std::memory_order_acquire))
for
(
const
auto
&
x
: m_map) deleter(
x
.second);
123
else
{
124
for
(
size_t
i=0 ;i <
m_fullMap
.size(); ++i){
125
if
(
m_fullMap
[i]) deleter(
m_fullMap
[i]);
126
}
127
}
128
}
IDC_WriteHandleBase.h
lock
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
InternalOfflineFast.h
InternalConstItr
I_InternalIDC::InternalConstItr InternalConstItr
Definition
InternalOffline.cxx:10
x
#define x
max
#define max(a, b)
Definition
cfImp.cxx:41
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::InternalOfflineFast::insert
virtual bool insert(IdentifierHash hashId, const void *ptr) override
Definition
InternalOfflineFast.cxx:86
EventContainers::InternalOfflineFast::cend
virtual InternalConstItr cend() const override
Definition
InternalOfflineFast.cxx:45
EventContainers::InternalOfflineFast::getAllHashPtrPair
virtual const std::vector< hashPair > & getAllHashPtrPair() const override
Definition
InternalOfflineFast.cxx:50
EventContainers::InternalOfflineFast::findIndexPtr
virtual const void * findIndexPtr(IdentifierHash hashId) const noexcept override
Definition
InternalOfflineFast.cxx:93
EventContainers::InternalOfflineFast::getAllCurrentHashes
virtual std::vector< IdentifierHash > getAllCurrentHashes() const override
Definition
InternalOfflineFast.cxx:34
EventContainers::InternalOfflineFast::fetchOrCreate
virtual StatusCode fetchOrCreate(IdentifierHash hashId) override
Definition
InternalOfflineFast.cxx:113
EventContainers::InternalOfflineFast::wait
virtual void wait() const override
Definition
InternalOfflineFast.cxx:23
EventContainers::InternalOfflineFast::tryAddFromCache
virtual bool tryAddFromCache(IdentifierHash hashId, EventContainers::IDC_WriteHandleBase &lock) override
Definition
InternalOfflineFast.cxx:14
EventContainers::InternalOfflineFast::cbegin
virtual InternalConstItr cbegin() const override
Definition
InternalOfflineFast.cxx:56
EventContainers::InternalOfflineFast::indexFind
virtual InternalConstItr indexFind(IdentifierHash hashId) const override
Definition
InternalOfflineFast.cxx:61
EventContainers::InternalOfflineFast::m_fullMap
std::vector< const void * > m_fullMap
Definition
InternalOfflineFast.h:43
EventContainers::InternalOfflineFast::removeCollection
virtual void * removeCollection(IdentifierHash hashId) override
Definition
InternalOfflineFast.cxx:106
EventContainers::InternalOfflineFast::destructor
virtual void destructor(deleter_f *) noexcept override
Definition
InternalOfflineFast.cxx:121
EventContainers::InternalOfflineFast::numberOfCollections
virtual size_t numberOfCollections() const override
Definition
InternalOfflineFast.cxx:68
EventContainers::InternalOfflineFast::InternalOfflineFast
InternalOfflineFast(size_t max)
Definition
InternalOfflineFast.cxx:11
EventContainers::InternalOfflineFast::cleanUp
virtual void cleanUp(deleter_f *deleter) noexcept override
Definition
InternalOfflineFast.cxx:73
EventContainers::InternalOfflineFast::ATLAS_THREAD_SAFE
std::vector< I_InternalIDC::hashPair > m_map ATLAS_THREAD_SAFE
Definition
InternalOfflineFast.h:42
EventContainers::InternalOfflineFast::addLock
virtual StatusCode addLock(IdentifierHash hashId, const void *ptr) override
Definition
InternalOfflineFast.cxx:98
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
Generated on
for ATLAS Offline Software by
1.17.0