ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Event
EventContainers
src
InternalOfflineMap.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
EventContainers/InternalOfflineMap.h
"
6
#include <algorithm>
7
#include "
EventContainers/IDC_WriteHandleBase.h
"
8
#include "
CxxUtils/AthUnlikelyMacros.h
"
9
10
using namespace
EventContainers
;
11
typedef
I_InternalIDC::InternalConstItr
InternalConstItr
;
12
InternalOfflineMap::InternalOfflineMap
(
size_t
max
) : m_needsupdate(false),
m_maxsize
(
max
) {}
13
14
15
bool
InternalOfflineMap::tryAddFromCache
(
IdentifierHash
hash,
EventContainers::IDC_WriteHandleBase
&) {
16
return
m_fullMap
.count(hash);
17
}
18
19
bool
InternalOfflineMap::tryAddFromCache
(
IdentifierHash
hash)
20
{
21
return
m_fullMap
.count(hash);
22
}
23
24
void
InternalOfflineMap::wait
()
const
{
25
std::scoped_lock
lock
(m_waitMutex);
26
if
(m_needsupdate.load(std::memory_order_acquire) ==
false
)
return
;
27
m_map.clear();
28
m_map.reserve(
m_fullMap
.size());
29
for
(
const
auto
&
pair
:
m_fullMap
){
30
m_map.emplace_back(
pair
.first,
pair
.second);
31
}
32
std::sort
(m_map.begin(), m_map.end());
33
m_needsupdate.store(
false
, std::memory_order_release);
34
}
35
36
std::vector<IdentifierHash>
InternalOfflineMap::getAllCurrentHashes
()
const
{
37
std::vector<IdentifierHash> ids;
38
ids.reserve(
m_fullMap
.size());
39
if
(m_needsupdate.load(std::memory_order_acquire) ==
true
){
40
for
(
const
auto
&
pair
:
m_fullMap
){
41
ids.emplace_back(
pair
.first);
42
}
43
std::sort
(ids.begin(), ids.end());
44
}
else
{
45
for
(
const
auto
&
pair
: m_map){
46
ids.emplace_back(
pair
.first);
47
}
48
}
49
return
ids;
50
}
51
52
InternalConstItr
53
InternalOfflineMap::cend
()
const
{
54
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
55
return
m_map.cend();
56
}
57
58
const
std::vector < I_InternalIDC::hashPair >&
InternalOfflineMap::getAllHashPtrPair
()
const
{
59
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
60
return
m_map;
61
}
62
63
InternalConstItr
64
InternalOfflineMap::cbegin
()
const
{
65
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
66
return
m_map.cbegin();
67
}
68
69
InternalConstItr
InternalOfflineMap::indexFind
(
IdentifierHash
hashId )
const
{
70
if
(m_needsupdate.load(std::memory_order_acquire))
wait
();
71
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; } );
72
if
(itr!= m_map.cend() && itr->first==hashId)
return
itr;
73
return
m_map.cend();
74
}
75
76
size_t
InternalOfflineMap::numberOfCollections
()
const
{
77
return
m_fullMap
.size();
78
}
79
80
void
InternalOfflineMap::cleanUp
(
deleter_f
* deleter)
noexcept
{
81
destructor
(deleter);
82
m_map.clear();
83
m_fullMap
.clear();
84
m_needsupdate.store(
false
, std::memory_order_release);
85
}
86
87
bool
InternalOfflineMap::insert
(
IdentifierHash
hashId,
const
void
* ptr) {
88
auto
&mapptr =
m_fullMap
[hashId];
89
if
(mapptr!=
nullptr
)
return
false
;
//already present
90
mapptr = ptr;
91
m_needsupdate.store(
true
, std::memory_order_relaxed);
92
return
true
;
93
}
94
95
const
void
*
InternalOfflineMap::findIndexPtr
(
IdentifierHash
hashId)
const
noexcept
{
96
auto
search
=
m_fullMap
.find(hashId);
97
if
(
search
!=
m_fullMap
.cend())
return
search
->second;
98
return
nullptr
;
99
}
100
101
StatusCode
InternalOfflineMap::addLock
(
IdentifierHash
hashId,
const
void
* ptr) {
102
bool
added =
insert
(hashId, ptr);
103
if
(
ATH_UNLIKELY
(!added)) {
104
throw
std::runtime_error(
"IDC WARNING Deletion shouldn't occur in addLock paradigm"
);
105
}
106
return
StatusCode::SUCCESS;
107
}
108
109
void
*
InternalOfflineMap::removeCollection
(
IdentifierHash
hashId ) {
110
auto
search
=
m_fullMap
.find(hashId);
111
if
(
search
==
m_fullMap
.cend())
return
nullptr
;
112
void
* ptr =
const_cast<
void
*
>
(
search
->second);
113
m_fullMap
.erase(
search
);
114
m_needsupdate.store(
true
, std::memory_order_relaxed);
115
return
ptr;
116
}
117
118
StatusCode
InternalOfflineMap::fetchOrCreate
(
IdentifierHash
) {
119
throw
std::runtime_error(
"Not implemented in offline mode"
);
120
}
121
StatusCode
InternalOfflineMap::fetchOrCreate
(
const
std::vector<IdentifierHash>&)
122
{
123
throw
std::runtime_error(
"Not implemented in offline mode"
);
124
}
125
126
void
InternalOfflineMap::destructor
(
deleter_f
* deleter)
noexcept
{
127
if
(!m_needsupdate.load(std::memory_order_acquire))
for
(
const
auto
&
x
: m_map) deleter(
x
.second);
128
else
{
129
for
(
const
auto
&
pair
:
m_fullMap
) { deleter(
pair
.second); }
130
}
131
}
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.
InternalOfflineMap.h
InternalConstItr
I_InternalIDC::InternalConstItr InternalConstItr
Definition
InternalOffline.cxx:11
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::InternalOfflineMap::indexFind
virtual InternalConstItr indexFind(IdentifierHash hashId) const override
Definition
InternalOfflineMap.cxx:69
EventContainers::InternalOfflineMap::cend
virtual InternalConstItr cend() const override
Definition
InternalOfflineMap.cxx:53
EventContainers::InternalOfflineMap::numberOfCollections
virtual size_t numberOfCollections() const override
Definition
InternalOfflineMap.cxx:76
EventContainers::InternalOfflineMap::m_maxsize
const size_t m_maxsize
Definition
InternalOfflineMap.h:47
EventContainers::InternalOfflineMap::wait
virtual void wait() const override
Definition
InternalOfflineMap.cxx:24
EventContainers::InternalOfflineMap::cleanUp
virtual void cleanUp(deleter_f *deleter) noexcept override
Definition
InternalOfflineMap.cxx:80
EventContainers::InternalOfflineMap::removeCollection
virtual void * removeCollection(IdentifierHash hashId) override
Definition
InternalOfflineMap.cxx:109
EventContainers::InternalOfflineMap::InternalOfflineMap
InternalOfflineMap(size_t max)
Definition
InternalOfflineMap.cxx:12
EventContainers::InternalOfflineMap::tryAddFromCache
virtual bool tryAddFromCache(IdentifierHash hashId, EventContainers::IDC_WriteHandleBase &lock) override
Definition
InternalOfflineMap.cxx:15
EventContainers::InternalOfflineMap::m_fullMap
std::unordered_map< IdentifierHash::value_type, const void * > m_fullMap
Definition
InternalOfflineMap.h:44
EventContainers::InternalOfflineMap::getAllCurrentHashes
virtual std::vector< IdentifierHash > getAllCurrentHashes() const override
Definition
InternalOfflineMap.cxx:36
EventContainers::InternalOfflineMap::findIndexPtr
virtual const void * findIndexPtr(IdentifierHash hashId) const noexcept override
Definition
InternalOfflineMap.cxx:95
EventContainers::InternalOfflineMap::destructor
virtual void destructor(deleter_f *) noexcept override
Definition
InternalOfflineMap.cxx:126
EventContainers::InternalOfflineMap::getAllHashPtrPair
virtual const std::vector< hashPair > & getAllHashPtrPair() const override
Definition
InternalOfflineMap.cxx:58
EventContainers::InternalOfflineMap::cbegin
virtual InternalConstItr cbegin() const override
Definition
InternalOfflineMap.cxx:64
EventContainers::InternalOfflineMap::insert
virtual bool insert(IdentifierHash hashId, const void *ptr) override
Definition
InternalOfflineMap.cxx:87
EventContainers::InternalOfflineMap::fetchOrCreate
virtual StatusCode fetchOrCreate(IdentifierHash hashId) override
Definition
InternalOfflineMap.cxx:118
EventContainers::InternalOfflineMap::addLock
virtual StatusCode addLock(IdentifierHash hashId, const void *ptr) override
Definition
InternalOfflineMap.cxx:101
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
pair
STL class.
search
void search(TDirectory *td, const std::string &s, std::string cwd, node *n)
recursive directory search for TH1 and TH2 and TProfiles
Definition
hcg.cxx:743
EventContainers
Definition
T_AthenaPoolCreateFuncs.h:33
std::sort
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Definition
DVL_algorithms.h:554
Generated on
for ATLAS Offline Software by
1.17.0