ATLAS Offline Software
Loading...
Searching...
No Matches
EventContainers::IdentifiableCache< T > Class Template Reference

#include <IdentifiableCache.h>

Inheritance diagram for EventContainers::IdentifiableCache< T >:
Collaboration diagram for EventContainers::IdentifiableCache< T >:

Classes

class  Maker

Public Types

typedef std::true_type thread_safe
typedef void deleter_f(const void *p)

Public Member Functions

 IdentifiableCache (IdentifierHash maxHash, const Maker *maker)
 IdentifiableCache (IdentifierHash maxHash, const Maker *maker, size_t lockBucketSize)
 ~IdentifiableCache ()
const T * find (IdentifierHash hash)
const T * findWait (IdentifierHash hash)
const T * get (IdentifierHash hash)
std::pair< bool, const void * > add (IdentifierHash hash, const T *p)
std::pair< bool, const void * > add (IdentifierHash hash, std::unique_ptr< T > p)
void clearCache ()
std::vector< IdentifierHashids ()
 In a threaded situation this collection will be valid but will not container hashes later added.
std::pair< bool, const void * > add (IdentifierHash hash, const void *p) noexcept
std::pair< bool, const void * > add (IdentifierHash hash, void_unique_ptr p) noexcept
std::pair< bool, const void * > addLock (IdentifierHash hash, const void *p) noexcept
std::pair< bool, const void * > addLock (IdentifierHash hash, void_unique_ptr p) noexcept
bool IMakerPresent () const
int tryLock (IdentifierHash, IDC_WriteHandleBase &, std::vector< IdentifierHash > &)
 Checks if the item is completed if it is not started it extablishes lock (returns 0), If it is started but not completed it adds to wait list (returns 1) If the item is already completed it returns 2 If the item is aborted it does nothing and returns 3.
int itemAborted (IdentifierHash)
 Returns 1 is the item has been aborted otherwise 0.
int itemInProgress (IdentifierHash)
 Returns 1 is the item is inprogress otherwise 0.
const void * waitFor (IdentifierHash)
 Halts the thread until the require hash is completed or aborted.
void createSet (const std::vector< IdentifierHash > &hashes, std::vector< bool > &mask)
 Create a set of hashes, updates an IDC mask as appropriate.
size_t fullSize () const
size_t numberOfHashes ()
 In a concurrent situation this number isn't necessarily perfectly synchronised with ids().size().

Static Public Attributes

static constexpr uintptr_t INVALIDflag = UINTPTR_MAX
static constexpr uintptr_t ABORTEDflag = UINTPTR_MAX-1

Protected Member Functions

void clear (deleter_f *deleter)
void cleanUp (deleter_f *deleter)
void notifyHash (IdentifierHash hash)

Private Types

typedef std::mutex mutex_t
typedef std::scoped_lock< mutex_tlock_t
typedef std::unique_lock< mutex_tuniqueLock

Private Attributes

std::vector< std::atomic< const void * > > m_vec
const IMakerm_maker
mutex_t m_mutex
std::atomic< size_t > m_currentHashes
 Holds the number of valid hashes in container, in concurrent use it is not guaranteed to be up to date.

Detailed Description

template<class T>
class EventContainers::IdentifiableCache< T >

Definition at line 27 of file IdentifiableCache.h.

Member Typedef Documentation

◆ deleter_f

typedef void EventContainers::IdentifiableCacheBase::deleter_f(const void *p)
inherited

Definition at line 14 of file IdentifiableCacheBase.h.

◆ lock_t

typedef std::scoped_lock<mutex_t> EventContainers::IdentifiableCacheBase::lock_t
privateinherited

Definition at line 97 of file IdentifiableCacheBase.h.

◆ mutex_t

typedef std::mutex EventContainers::IdentifiableCacheBase::mutex_t
privateinherited

Definition at line 96 of file IdentifiableCacheBase.h.

◆ thread_safe

typedef std::true_type EventContainers::IdentifiableCacheBase::thread_safe
inherited

Definition at line 31 of file IdentifiableCacheBase.h.

◆ uniqueLock

typedef std::unique_lock<mutex_t> EventContainers::IdentifiableCacheBase::uniqueLock
privateinherited

Definition at line 98 of file IdentifiableCacheBase.h.

Constructor & Destructor Documentation

◆ IdentifiableCache() [1/2]

template<class T>
EventContainers::IdentifiableCache< T >::IdentifiableCache ( IdentifierHash maxHash,
const Maker * maker )
inline

Definition at line 43 of file IdentifiableCache.h.

◆ IdentifiableCache() [2/2]

template<class T>
EventContainers::IdentifiableCache< T >::IdentifiableCache ( IdentifierHash maxHash,
const Maker * maker,
size_t lockBucketSize )
inline

Definition at line 48 of file IdentifiableCache.h.

◆ ~IdentifiableCache()

Member Function Documentation

◆ add() [1/4]

template<class T>
std::pair< bool, const void * > EventContainers::IdentifiableCache< T >::add ( IdentifierHash hash,
const T * p )
inline

Definition at line 74 of file IdentifiableCache.h.

75 {
77 }
std::pair< bool, const void * > add(IdentifierHash hash, const void *p) noexcept

◆ add() [2/4]

template<class T>
std::pair< bool, const void * > EventContainers::IdentifiableCache< T >::add ( IdentifierHash hash,
std::unique_ptr< T > p )
inline

◆ add() [3/4]

std::pair< bool, const void * > EventContainers::IdentifiableCacheBase::add ( IdentifierHash hash,
const void * p )
noexceptinherited

Definition at line 204 of file IdentifiableCacheBase.cxx.

205{
206 if (ATH_UNLIKELY(hash >= m_vec.size())) return std::make_pair(false, nullptr);
207 if(p==nullptr) return std::make_pair(false, nullptr);
208 const void* nul=nullptr;
209 if(m_vec[hash].compare_exchange_strong(nul, p, std::memory_order_release, std::memory_order_relaxed)){
210 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
211 return std::make_pair(true, p);
212 }
213 const void* invalid = INVALID;
214 if(m_vec[hash].compare_exchange_strong(invalid, p, std::memory_order_release, std::memory_order_acquire)){
215 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
216 notifyHash(hash);
217 return std::make_pair(true, p);
218 }
219 return std::make_pair(false, invalid);
220}
#define ATH_UNLIKELY(x)
std::vector< std::atomic< const void * > > m_vec
std::atomic< size_t > m_currentHashes
Holds the number of valid hashes in container, in concurrent use it is not guaranteed to be up to dat...
const void *const INVALID

◆ add() [4/4]

std::pair< bool, const void * > EventContainers::IdentifiableCacheBase::add ( IdentifierHash hash,
void_unique_ptr p )
noexceptinherited

Definition at line 251 of file IdentifiableCacheBase.cxx.

253{
254 std::pair<bool, const void*> b = add(hash, p.get());
255 if(b.first) p.release();
256 return b;
257}

◆ addLock() [1/2]

std::pair< bool, const void * > EventContainers::IdentifiableCacheBase::addLock ( IdentifierHash hash,
const void * p )
noexceptinherited

Definition at line 223 of file IdentifiableCacheBase.cxx.

224{ //Same as method above except we check for invalid state first,
225 // more optimal for calling using writehandle lock method
226 assert(hash < m_vec.size());
227 if(p==nullptr) return std::make_pair(false, nullptr);
228 const void* invalid = INVALID;
229 if(m_vec[hash].compare_exchange_strong(invalid, p, std::memory_order_release, std::memory_order_relaxed)){
230 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
231 notifyHash(hash);
232 return std::make_pair(true, p);
233 }
234 const void* nul=nullptr;
235 if(m_vec[hash].compare_exchange_strong(nul, p, std::memory_order_release, std::memory_order_acquire)){
236 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
237 return std::make_pair(true, p);
238 }
239 return std::make_pair(false, nul);
240}

◆ addLock() [2/2]

std::pair< bool, const void * > EventContainers::IdentifiableCacheBase::addLock ( IdentifierHash hash,
void_unique_ptr p )
noexceptinherited

Definition at line 242 of file IdentifiableCacheBase.cxx.

244{
245 std::pair<bool, const void*> b = addLock(hash, p.get());
246 if(b.first) p.release();
247 return b;
248}
std::pair< bool, const void * > addLock(IdentifierHash hash, const void *p) noexcept

◆ cleanUp()

void EventContainers::IdentifiableCacheBase::cleanUp ( deleter_f * deleter)
protectedinherited

Definition at line 79 of file IdentifiableCacheBase.cxx.

80{
81 if(0 != m_currentHashes.load(std::memory_order_acquire)){ //Reduce overhead if cache was unused
82 size_t s = m_vec.size();
83 for (size_t i=0; i<s ;i++) {
84 const void* p = m_vec[i].load(std::memory_order_relaxed);
85 if(p && p < ABORTED) deleter (p);
86 }
87 }
88}
IPayloadDeleter & deleter()
Return a reference to the payload deleter object.
const void *const ABORTED

◆ clear()

void EventContainers::IdentifiableCacheBase::clear ( deleter_f * deleter)
protectedinherited

Definition at line 60 of file IdentifiableCacheBase.cxx.

61{
62 size_t s = m_vec.size();
63 if(0 != m_currentHashes.load(std::memory_order_relaxed)){
64 for (size_t i=0; i<s ;i++) {
65 const void* ptr = m_vec[i].load(std::memory_order_relaxed);
66 m_vec[i].store(nullptr, std::memory_order_relaxed);
67 if (ptr && ptr < ABORTED){
68 deleter (ptr);
69 }
70 }
71 m_currentHashes.store(0, std::memory_order_relaxed);
72 }else{
73 for (size_t i=0; i<s ;i++) m_vec[i].store(nullptr, std::memory_order_relaxed);//Need to clear incase of aborts
74 }
75}
TestStore store
Definition TestStore.cxx:23
void * ptr(T *p)
Definition SGImplSvc.cxx:74

◆ clearCache()

template<class T>
void EventContainers::IdentifiableCache< T >::clearCache ( )
inline

◆ createSet()

void EventContainers::IdentifiableCacheBase::createSet ( const std::vector< IdentifierHash > & hashes,
std::vector< bool > & mask )
inherited

Create a set of hashes, updates an IDC mask as appropriate.

Definition at line 176 of file IdentifiableCacheBase.cxx.

176 {
177 assert(mask.size() == fullSize());
178 for(IdentifierHash hash : hashes){
179 const void* ptr = get(hash);
180 if(ptr !=nullptr) mask[hash] = true;
181 }
182}
const void * get(IdentifierHash hash)
Try to make payload if not there.

◆ find()

template<class T>
const T * EventContainers::IdentifiableCache< T >::find ( IdentifierHash hash)
inline

Definition at line 59 of file IdentifiableCache.h.

◆ findWait()

template<class T>
const T * EventContainers::IdentifiableCache< T >::findWait ( IdentifierHash hash)
inline

Definition at line 64 of file IdentifiableCache.h.

◆ fullSize()

size_t EventContainers::IdentifiableCacheBase::fullSize ( ) const
inlineinherited

Definition at line 81 of file IdentifiableCacheBase.h.

81{ return m_vec.size(); }

◆ get()

template<class T>
const T * EventContainers::IdentifiableCache< T >::get ( IdentifierHash hash)
inline

Definition at line 69 of file IdentifiableCache.h.

◆ ids()

std::vector< IdentifierHash > EventContainers::IdentifiableCacheBase::ids ( )
inherited

In a threaded situation this collection will be valid but will not container hashes later added.

Definition at line 190 of file IdentifiableCacheBase.cxx.

191{
192 std::vector<IdentifierHash> ret;
193 ret.reserve (m_currentHashes.load(std::memory_order_relaxed));
194 size_t s = m_vec.size();
195 for (size_t i =0; i<s; i++) {
196 const void* p = m_vec[i].load(std::memory_order_relaxed);
197 if (p && p < ABORTED)
198 ret.push_back (i);
199 }
200 return ret;
201}

◆ IMakerPresent()

bool EventContainers::IdentifiableCacheBase::IMakerPresent ( ) const
inlineinherited

Definition at line 61 of file IdentifiableCacheBase.h.

61{ return m_maker!=nullptr; }

◆ itemAborted()

int EventContainers::IdentifiableCacheBase::itemAborted ( IdentifierHash hash)
inherited

Returns 1 is the item has been aborted otherwise 0.

Definition at line 90 of file IdentifiableCacheBase.cxx.

90 {
91 const void* p = m_vec[hash].load(std::memory_order_relaxed); //Relaxed because it is not returning a pointer to anything
92 return (p == ABORTED);
93}

◆ itemInProgress()

int EventContainers::IdentifiableCacheBase::itemInProgress ( IdentifierHash hash)
inherited

Returns 1 is the item is inprogress otherwise 0.

Definition at line 96 of file IdentifiableCacheBase.cxx.

96 {
97 const void* p = m_vec[hash].load(std::memory_order_relaxed); //Relaxed because it is not returning a pointer to anything
98 return (p == INVALID);
99}

◆ notifyHash()

void EventContainers::IdentifiableCacheBase::notifyHash ( IdentifierHash hash)
protectedinherited

Definition at line 131 of file IdentifiableCacheBase.cxx.

132{
133 m_vec[hash].notify_all();
134}

◆ numberOfHashes()

size_t EventContainers::IdentifiableCacheBase::numberOfHashes ( )
inherited

In a concurrent situation this number isn't necessarily perfectly synchronised with ids().size().

Definition at line 185 of file IdentifiableCacheBase.cxx.

186{
187 return m_currentHashes.load(std::memory_order_relaxed); //Not to be used for syncing
188}

◆ tryLock()

int EventContainers::IdentifiableCacheBase::tryLock ( IdentifierHash hash,
IDC_WriteHandleBase & lock,
std::vector< IdentifierHash > & wait )
inherited

Checks if the item is completed if it is not started it extablishes lock (returns 0), If it is started but not completed it adds to wait list (returns 1) If the item is already completed it returns 2 If the item is aborted it does nothing and returns 3.

Definition at line 40 of file IdentifiableCacheBase.cxx.

40 {
41 const void *ptr1 =nullptr;
42
43 if(m_vec[hash].compare_exchange_strong(ptr1, INVALID, std::memory_order_relaxed, std::memory_order_relaxed)){//atomic swap (replaces ptr1 with value)
44 //First call
45 //Setup the IDC_WriteHandle to "lock" on this hash's pointer
46 lock.LockOn(&m_vec[hash]);
47 return 0;
48 }
49
50 if(ptr1 == INVALID){
51 //Second call while not finished
52 wait.emplace_back(hash);
53 return 1;
54 }
55 if(ptr1 == ABORTED) return 3;
56 return 2; //Already completed
57}
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.

◆ waitFor()

const void * EventContainers::IdentifiableCacheBase::waitFor ( IdentifierHash hash)
inherited

Halts the thread until the require hash is completed or aborted.

Definition at line 111 of file IdentifiableCacheBase.cxx.

112{
113 std::atomic<const void*> &myatomic = m_vec[hash];
114 const void* item = myatomic.load(std::memory_order_acquire);
115 //Wait until pointer is set then retrieve and verify
116 while(item == INVALID){//Loop to check for spurious wakeups
117 myatomic.wait(item, std::memory_order_relaxed);
118 item = myatomic.load(std::memory_order_acquire);
119 }
120 return item;
121}

Member Data Documentation

◆ ABORTEDflag

uintptr_t EventContainers::IdentifiableCacheBase::ABORTEDflag = UINTPTR_MAX-1
staticconstexprinherited

Definition at line 28 of file IdentifiableCacheBase.h.

◆ INVALIDflag

uintptr_t EventContainers::IdentifiableCacheBase::INVALIDflag = UINTPTR_MAX
staticconstexprinherited

Definition at line 27 of file IdentifiableCacheBase.h.

◆ m_currentHashes

std::atomic<size_t> EventContainers::IdentifiableCacheBase::m_currentHashes
privateinherited

Holds the number of valid hashes in container, in concurrent use it is not guaranteed to be up to date.

Definition at line 101 of file IdentifiableCacheBase.h.

◆ m_maker

const IMaker* EventContainers::IdentifiableCacheBase::m_maker
privateinherited

Definition at line 94 of file IdentifiableCacheBase.h.

◆ m_mutex

mutex_t EventContainers::IdentifiableCacheBase::m_mutex
privateinherited

Definition at line 99 of file IdentifiableCacheBase.h.

◆ m_vec

std::vector<std::atomic<const void*> > EventContainers::IdentifiableCacheBase::m_vec
privateinherited

Definition at line 92 of file IdentifiableCacheBase.h.


The documentation for this class was generated from the following file: