ATLAS Offline Software
IdentifiableContainerMT.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef EVENTCONTAINERS_IDENTIFIABLECONTAINERMT_H
6 #define EVENTCONTAINERS_IDENTIFIABLECONTAINERMT_H
7 
19 #include "Identifier/Identifier.h"
21 #include <memory>
22 #include "GaudiKernel/DataObject.h"
27 #include <bit>
28 
29 template < class T>
31 {
32 
33 public:
34 
36  friend class IdentifiableContainerMT<T>;
39  public:
44  static void Swap(IDC_WriteHandle& a, IDC_WriteHandle& b) noexcept {
45  if(&a == &b) return;
46  std::swap(a.m_IDC_ptr, b.m_IDC_ptr);
47  std::swap(a.m_hashId, b.m_hashId);
48  std::swap(a.m_atomic, b.m_atomic);
49  }
51  Swap(*this, other);
52  }
53 
54  [[nodiscard]] StatusCode addOrDelete(std::unique_ptr<T> ptr){
55  if(ATH_UNLIKELY(m_hashId >= m_IDC_ptr->m_link->fullSize())) return StatusCode::FAILURE;
56  StatusCode sc = m_IDC_ptr->addLock(std::move(ptr), m_hashId);
57  IDC_WriteHandleBase::ReleaseLock();
58  return sc;
59  }
60  bool alreadyPresent() { return m_IDC_ptr->m_link->tryAddFromCache(m_hashId, *this); }
62  bool OnlineAndPresentInAnotherView() { return m_IDC_ptr->m_OnlineMode && m_IDC_ptr->m_link->tryAddFromCache(m_hashId, *this); }
63  };
64 
65 
66 
67  typedef T IDENTIFIABLE;
70  typedef std::vector<std::atomic<const void*> >::size_type size_type;
71  typedef T*& reference;
72  typedef T* const & const_reference;
73  typedef T* value_type;
74  typedef T** pointer;
75  typedef T* const * const_pointer;
76  typedef T base_value_type;
77 
78 
80  {
81 
82  public:
83 
87  const_iterator(const const_iterator&) = default;
88  const_iterator& operator = ( const const_iterator & ) = default; //move operators may be useful for shared_ptr
90  ~const_iterator() = default;
91 
92 
95  ++m_itr;
96  return *this;
97  }
98 
101  const_iterator tmp = *this;
102  ++*this;
103  return tmp;
104  }
105 
106  const T* cptr () const {
107  return std::bit_cast<const T*>( m_itr->second );
108  }
109 
110  const T* operator * () const {
111  return std::bit_cast<const T*>( m_itr->second );
112  }
113 
114  const T* operator ->() const { return (operator*()); }
115 
117  bool operator != ( const const_iterator &it ) const {
118  return m_itr!= it.m_itr;
119  }
120 
122  bool operator == ( const const_iterator &it ) const {
123  return m_itr == it.m_itr;
124  }
125 
127  //Calling this on an end iterator is undefined behaviour
129  return m_itr->first;
130  }
131 
132  protected:
133  friend class IdentifiableContainerMT<T>;
134 
136 
137 
139  };
140 
141  friend class IDC_WriteHandle;
142 
145 
147 
150 
152 
153  virtual bool hasExternalCache() const override final { return m_OnlineMode; }
154 
155 
159  virtual const T* indexFindPtr( IdentifierHash hashId ) const override final;
160 
162  return m_link->indexFind(hashId);
163  }
164 
167  virtual StatusCode addCollection(const T* coll, IdentifierHash hashId) override final;
168 
171  virtual StatusCode addOrDelete(std::unique_ptr<T>, IdentifierHash hashId) override final;
172  virtual StatusCode addOrDelete(std::unique_ptr<const T>, IdentifierHash hashId) override final;
173 
175  StatusCode addOrDelete(std::unique_ptr<T>, IdentifierHash hashId, bool &deleted);
176 
178  StatusCode addLock(std::unique_ptr<T> ptr, IdentifierHash hashId);
179 
182  virtual bool tryAddFromCache(IdentifierHash hashId) override final;
183 
187 
188  StatusCode fetchOrCreate(const std::vector<IdentifierHash> &hashId);
189 
190  //This is a method to support bad behaviour in old code. Remove ASAP
191  virtual StatusCode naughtyRetrieve ATLAS_NOT_THREAD_SAFE (IdentifierHash hashId, T* &collToRetrieve) const override final;
192 
193 
197 
199  virtual void cleanup() override final;
200 
202  virtual size_t fullSize() const override final {
203  return m_link->fullSize();
204  }
205 
207  size_t size() const {
208  return m_link->fullSize();
209  }
210 
211  void prepareItr() const { m_link->wait(); }
212 
214  virtual size_t numberOfCollections() const override final{
215  return IdentifiableContainerBase::numberOfCollections();
216  }
217 
218  const std::vector < EventContainers::hashPair<T> >& GetAllHashPtrPair() const{
219  static_assert(sizeof(const T*) == sizeof(const void*) && std::is_pointer<const T*>::value);
220  static_assert(sizeof(EventContainers::hashPair<T>) == sizeof(EventContainers::hashPair<void>));
221  return reinterpret_cast<const std::vector < EventContainers::hashPair<T> >&>
222  (m_link->getAllHashPtrPair());
223  }
224 
229  virtual std::vector<IdentifierHash> GetAllCurrentHashes() const override final {
230  return IdentifiableContainerBase::GetAllCurrentHashes();
231  }
232 
235  return const_iterator(m_link->cbegin());
236  }
237 
238 
240  const_iterator end() const {
241  return const_iterator(m_link->cend());
242  }
243 
245  bool empty() const {
246  return numberOfCollections()==0;
247  }
248 
250  {
252  lock.m_hashId = hash;
253  lock.m_IDC_ptr = this;
254  return lock;
255  }
256 };
257 
258 template < class T>
259 T* //Please don't do this we want to get rid of this
261 {
262  return std::bit_cast<T*>(m_link->removeCollection(hashId));
263 }
264 
265 
266 
267 // Constructor for OFFLINE style IDC
268 template < class T>
269 IdentifiableContainerMT<T>::IdentifiableContainerMT(IdentifierHash maxHash) : IdentifiableContainerBase(maxHash)
270 {
271 }
272 
273 template < class T>
275  IdentifiableContainerBase(maxHash, mode)
276 {
277 }
278 
279 // Constructor for ONLINE style IDC
280 template < class T>
281 IdentifiableContainerMT<T>::IdentifiableContainerMT(ICACHE *cache) : IdentifiableContainerBase(cache)
282 {
283 }
284 
288 template < class T>
289 const T*
291 {
292  return std::bit_cast<const T* > (IdentifiableContainerBase::indexFindPtr(hashId));
293 }
294 
295 // insert collection into container with id hash
296 template < class T>
299 {
300  // update m_hashids
301  if (ATH_UNLIKELY(! IdentifiableContainerBase::insert(hashId, coll))) return StatusCode::FAILURE;
302  return StatusCode::SUCCESS;
303 
304 }
305 
306 
307 
308 template < class T>
309 void
311 {
312  IdentifiableContainerBase::cleanup(void_unique_ptr::Deleter<T>::deleter);
313 }
314 
315 template < class T>
318 {
319  return IdentifiableContainerBase::fetchOrCreate(hashId);
320 }
321 
322 template < class T>
324 IdentifiableContainerMT<T>::fetchOrCreate(const std::vector<IdentifierHash> &hashIds)
325 {
326  return IdentifiableContainerBase::fetchOrCreate(hashIds);
327 }
328 
329 
330 template < class T>
331 bool
333 {
334  return IdentifiableContainerBase::tryAddFromCache(hashId);
335 }
336 
337 template < class T >
338 StatusCode
339 IdentifiableContainerMT<T>::naughtyRetrieve(IdentifierHash hashId, T* &collToRetrieve) const
340 {
341  if(ATH_UNLIKELY(m_OnlineMode)) return StatusCode::FAILURE;//NEVER ALLOW FOR EXTERNAL CACHE
342  else {
343  auto p = std::bit_cast<const T* > (m_link->findIndexPtr(hashId));//collToRetrieve can be null on success
344  collToRetrieve = const_cast<T*>(p);
345  return StatusCode::SUCCESS;
346  }
347 }
348 
349 template < class T>
352 {
353  if(ATH_UNLIKELY(hashId >= m_link->fullSize())) return StatusCode::FAILURE;
354  auto ptr = uptr.release();
355  bool b = IdentifiableContainerBase::insert(hashId, ptr);
356  if(!b) delete ptr;
357  return StatusCode::SUCCESS;
358 }
359 
360 template < class T>
362 IdentifiableContainerMT<T>::addOrDelete(std::unique_ptr<const T> uptr, IdentifierHash hashId)
363 {
364  if(ATH_UNLIKELY(hashId >= m_link->fullSize())) return StatusCode::FAILURE;
365  auto ptr = uptr.release();
366  bool b = IdentifiableContainerBase::insert(hashId, ptr);
367  if(!b) delete ptr;
368  return StatusCode::SUCCESS;
369 }
370 
371 template < class T>
374 {
375  return m_link->addLock(hashId, ptr.release());
376 }
377 
378 template < class T>
380 IdentifiableContainerMT<T>::addOrDelete(std::unique_ptr<T> uptr, IdentifierHash hashId, bool &deleted)
381 {
382  if(ATH_UNLIKELY(hashId >= m_link->fullSize())) return StatusCode::FAILURE;
383  auto ptr = uptr.release();
384  bool b = IdentifiableContainerBase::insert(hashId, ptr);
385  if(!b) delete ptr;
386  deleted = !b;
387  return StatusCode::SUCCESS;
388 }
389 
390 #endif
391 
IdentifiableContainerMT::IDC_WriteHandle::operator=
IDC_WriteHandle & operator=(const IDC_WriteHandle &other)=delete
IdentifiableContainerMT::~IdentifiableContainerMT
~IdentifiableContainerMT()
Definition: IdentifiableContainerMT.h:151
IdentifiableContainerMT::IDC_WriteHandle::m_hashId
IdentifierHash m_hashId
Definition: IdentifiableContainerMT.h:38
IdentifiableContainerMT::base_value_type
T base_value_type
Definition: IdentifiableContainerMT.h:76
IdentifiableContainerMT::IDC_WriteHandle::m_IDC_ptr
IdentifiableContainerMT< T > * m_IDC_ptr
Definition: IdentifiableContainerMT.h:37
IdentifiableContainerMT::addCollection
virtual StatusCode addCollection(const T *coll, IdentifierHash hashId) override final
insert collection into container with id hash if IDC should not take ownership of collection,...
Definition: IdentifiableContainerMT.h:298
IdentifiableContainerMT::getWriteHandle
IDC_WriteHandle getWriteHandle(IdentifierHash hash)
Definition: IdentifiableContainerMT.h:249
IdentifiableContainerMT::const_iterator::const_iterator
const_iterator()
iterator constructor
Definition: IdentifiableContainerMT.h:85
IdentifiableCache.h
IdentifiableContainerMT::IDC_WriteHandle::operator=
IDC_WriteHandle & operator=(IDC_WriteHandle &&other) noexcept=delete
IdentifiableContainerMT::const_iterator::operator==
bool operator==(const const_iterator &it) const
comparison operator
Definition: IdentifiableContainerMT.h:122
EventContainers::IDC_WriteHandleBase::IDC_WriteHandleBase
IDC_WriteHandleBase()
Definition: IDC_WriteHandleBase.h:17
IdentifiableContainerMT::reference
T *& reference
Definition: IdentifiableContainerMT.h:71
IdentifiableContainerMT::IDC_WriteHandle::OnlineAndPresentInAnotherView
bool OnlineAndPresentInAnotherView()
This method is to avoid calling an expensive operation in the offline case.
Definition: IdentifiableContainerMT.h:62
IIdentifiableCont.h
skel.it
it
Definition: skel.GENtoEVGEN.py:407
IdentifiableContainerMT::size
size_t size() const
Duplicate of fullSize for backwards compatability.
Definition: IdentifiableContainerMT.h:207
IdentifiableContainerMT::const_iterator::const_iterator
const_iterator(const const_iterator &)=default
IdentifiableContainerMT::size_type
std::vector< std::atomic< const void * > >::size_type size_type
Definition: IdentifiableContainerMT.h:70
IdentifiableContainerMT::IDENTIFIABLE
T IDENTIFIABLE
Definition: IdentifiableContainerMT.h:67
athena.value
value
Definition: athena.py:124
IdentifiableContainerMT::MyType
IdentifiableContainerMT< T > MyType
Definition: IdentifiableContainerMT.h:69
ATH_UNLIKELY
#define ATH_UNLIKELY(x)
Definition: AthUnlikelyMacros.h:17
python.RatesEmulationExample.lock
lock
Definition: RatesEmulationExample.py:148
IdentifiableContainerMT::IDC_WriteHandle::alreadyPresent
bool alreadyPresent()
Definition: IdentifiableContainerMT.h:60
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
EventContainers::hashPair
Definition: I_InternalIDC.h:26
IdentifiableContainerMT::const_iterator::operator!=
bool operator!=(const const_iterator &it) const
comparison operator
Definition: IdentifiableContainerMT.h:117
IdentifiableContainerMT::const_iterator::const_iterator
const_iterator(EventContainers::I_InternalIDC::InternalConstItr itr)
Definition: IdentifiableContainerMT.h:135
void_unique_ptr::Deleter
Definition: deleter.h:23
IdentifiableContainerMT::value_type
T * value_type
Definition: IdentifiableContainerMT.h:73
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
EventContainers::IIdentifiableCont
Definition: IIdentifiableCont.h:13
IdentifiableContainerMT::empty
bool empty() const
return true if container is empty
Definition: IdentifiableContainerMT.h:245
IdentifiableContainerMT::const_iterator::operator=
const_iterator & operator=(const const_iterator &)=default
AthUnlikelyMacros.h
IdentifiableContainerMT::hasExternalCache
virtual bool hasExternalCache() const override final
Definition: IdentifiableContainerMT.h:153
IdentifiableContainerMT::IDC_WriteHandle::IDC_WriteHandle
IDC_WriteHandle(IDC_WriteHandle &&other)
Definition: IdentifiableContainerMT.h:50
IdentifiableContainerMT::ICACHE
EventContainers::IdentifiableCache< T > ICACHE
Definition: IdentifiableContainerMT.h:68
IdentifiableContainerMT::prepareItr
void prepareItr() const
Definition: IdentifiableContainerMT.h:211
EventContainers::IdentifiableContainerBase::m_link
std::unique_ptr< I_InternalIDC > m_link
Definition: IdentifiableContainerBase.h:26
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
IdentifiableContainerMT::numberOfCollections
virtual size_t numberOfCollections() const override final
return number of collections
Definition: IdentifiableContainerMT.h:214
IdentifiableContainerMT::const_iterator::operator*
const T * operator*() const
Definition: IdentifiableContainerMT.h:110
IdentifiableContainerMT::GetAllCurrentHashes
virtual std::vector< IdentifierHash > GetAllCurrentHashes() const override final
Returns a collection of all hashes availiable in this IDC.
Definition: IdentifiableContainerMT.h:229
IdentifiableContainerMT::const_pointer
T *const * const_pointer
Definition: IdentifiableContainerMT.h:75
IdentifiableContainerMT::addOrDelete
virtual StatusCode addOrDelete(std::unique_ptr< T >, IdentifierHash hashId) override final
Tries to add the item to the cache, if the item already exists then it is deleted This is a convenien...
Definition: IdentifiableContainerMT.h:351
IdentifiableContainerMT::addLock
StatusCode addLock(std::unique_ptr< T > ptr, IdentifierHash hashId)
Like the other add methods but optimized for changing from the inprogress state.
Definition: IdentifiableContainerMT.h:373
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
IdentifiableContainerMT::fullSize
virtual size_t fullSize() const override final
return full size of container
Definition: IdentifiableContainerMT.h:202
IdentifiableContainerMT::tryAddFromCache
virtual bool tryAddFromCache(IdentifierHash hashId) override final
Looks in the cache to see if item already exists if not it returns false, If it does exist it incorpo...
Definition: IdentifiableContainerMT.h:332
IdentifiableContainerMT::indexFind
const_iterator indexFind(IdentifierHash hashId) const
Definition: IdentifiableContainerMT.h:161
IdentifiableContainerMT::IDC_WriteHandle
Definition: IdentifiableContainerMT.h:35
IDC_WriteHandleBase.h
IdentifiableContainerMT::end
const_iterator end() const
return const_iterator for end of container
Definition: IdentifiableContainerMT.h:240
Preparation.mode
mode
Definition: Preparation.py:107
IdentifiableContainerMT::removeCollection
T * removeCollection(IdentifierHash hashId)
remove collection from container for id hash, returning it (and ownership) to client
Definition: IdentifiableContainerMT.h:260
IdentifiableContainerMT::const_iterator
Definition: IdentifiableContainerMT.h:80
IdentifiableContainerMT::begin
const_iterator begin() const
return const_iterator for first entry
Definition: IdentifiableContainerMT.h:234
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
columnar::final
CM final
Definition: ColumnAccessor.h:106
EventContainers::IdentifiableContainerBase
Definition: IdentifiableContainerBase.h:14
IdentifiableContainerMT::const_iterator::hashId
IdentifierHash hashId() const
hashId of the pointed-to element
Definition: IdentifiableContainerMT.h:128
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
EventContainers::Mode
Mode
Definition: IdentifiableContainerBase.h:13
IdentifiableContainerMT::const_iterator::cptr
const T * cptr() const
Definition: IdentifiableContainerMT.h:106
IdentifiableContainerMT::const_reference
T *const & const_reference
Definition: IdentifiableContainerMT.h:72
IdentifiableContainerMT::IDC_WriteHandle::addOrDelete
StatusCode addOrDelete(std::unique_ptr< T > ptr)
Definition: IdentifiableContainerMT.h:54
IdentifiableContainerMT::indexFindPtr
virtual const T * indexFindPtr(IdentifierHash hashId) const override final
return pointer on the found entry or null if out of range using hashed index - fast version,...
Definition: IdentifiableContainerMT.h:290
IdentifiableContainerMT::pointer
T ** pointer
Definition: IdentifiableContainerMT.h:74
EventContainers::IIdentifiableCont::naughtyRetrieve
virtual StatusCode naughtyRetrieve(IdentifierHash hashId, T *&collToRetrieve) const =0
a
TList * a
Definition: liststreamerinfos.cxx:10
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:108
IdentifiableContainerMT::const_iterator::operator->
const T * operator->() const
Definition: IdentifiableContainerMT.h:114
IdentifiableContainerMT::fetchOrCreate
StatusCode fetchOrCreate(IdentifierHash hashId)
Tries will look for item in cache, if it doesn't exist will call the cache IMAKER If cache doesn't ha...
Definition: IdentifiableContainerMT.h:317
IdentifiableContainerMT::IDC_WriteHandle::IDC_WriteHandle
IDC_WriteHandle(const IDC_WriteHandle &other)=delete
IdentifiableContainerMT::IDC_WriteHandle::Swap
static void Swap(IDC_WriteHandle &a, IDC_WriteHandle &b) noexcept
Definition: IdentifiableContainerMT.h:44
IdentifiableContainerMT::GetAllHashPtrPair
const std::vector< EventContainers::hashPair< T > > & GetAllHashPtrPair() const
Definition: IdentifiableContainerMT.h:218
EventContainers::IDC_WriteHandleBase
Definition: IDC_WriteHandleBase.h:13
IdentifiableContainerMT::const_iterator::m_itr
EventContainers::I_InternalIDC::InternalConstItr m_itr
Definition: IdentifiableContainerMT.h:138
IdentifiableContainerMT::IDC_WriteHandle::IDC_WriteHandle
IDC_WriteHandle()
Definition: IdentifiableContainerMT.h:40
IdentifiableContainerMT::addOrDelete
virtual StatusCode addOrDelete(std::unique_ptr< const T >, IdentifierHash hashId) override final
EventContainers::IdentifiableContainerBase::m_OnlineMode
bool m_OnlineMode
Definition: IdentifiableContainerBase.h:24
IdentifiableContainerMT
Definition: IdentifiableContainerMT.h:31
IdentifiableContainerMT::ATLAS_NOT_THREAD_SAFE
virtual StatusCode naughtyRetrieve ATLAS_NOT_THREAD_SAFE(IdentifierHash hashId, T *&collToRetrieve) const override final
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
IdentifiableContainerBase.h
IdentifiableContainerMT::IdentifiableContainerMT
IdentifiableContainerMT(IdentifierHash hashMax)
constructor initializes the collection the hashmax, OFFLINE usages pattern
Definition: IdentifiableContainerMT.h:269
IdentifiableContainerMT::const_iterator::operator++
const_iterator & operator++()
increment operator
Definition: IdentifiableContainerMT.h:94
IdentifiableContainerMT::const_iterator::const_iterator
const_iterator(const_iterator &&)=default
EventContainers::I_InternalIDC::InternalConstItr
std::vector< hashPair >::const_iterator InternalConstItr
Definition: I_InternalIDC.h:38
IdentifiableContainerMT::cleanup
virtual void cleanup() override final
reset m_hashids and call IdentifiableCache's cleanup
Definition: IdentifiableContainerMT.h:310
EventContainers::IdentifiableCache
Definition: IdentifiableCache.h:29
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
IdentifiableContainerMT::const_iterator::~const_iterator
~const_iterator()=default