1 #ifndef GENBANK_IMPL_INFO_CACHE
2 #define GENBANK_IMPL_INFO_CACHE
45 #include <unordered_map>
52 #define USE_MAIN_MUTEX_IN_CACHE 0
53 #define USE_MAIN_MUTEX_FOR_DATA 0
276 return size_t(ptr)>>3;
384 #if USE_MAIN_MUTEX_FOR_DATA
451 #if USE_MAIN_MUTEX_IN_CACHE
465 #if USE_MAIN_MUTEX_IN_CACHE
488 bool x_Check(
const vector<const CInfo_Base*>& infos)
const;
509 template<
class DataType>
class CInfoLock;
511 template<
class DataType>
529 template<
class DataType>
569 template<
class KeyType,
class DataType>
620 return iter !=
m_Index.
end() && iter->second->IsLoaded(requestor);
686 iter->second->IsLoaded(requestor) ) {
687 x_SetInfo(lock, requestor, *iter->second);
700 vector<const CInfo_Base*> infos;
702 infos.push_back(it->second);
void Release()
Manually force the resource to be released.
CInfo(typename CInfo_Base::TGCQueue &gc_queue, const TKey &key)
const TKey & GetKey(void) const
void x_SetInfo(CInfoLock_Base &lock, CInfoRequestor &requestor, CInfo_Base &info)
void ReleaseInfos(const vector< CInfo_Base * > &infos)
void x_RemoveFromGCQueue(CInfo_Base &info)
size_t GetMaxGCQueueSize(void) const
void x_SetUsed(CInfo_Base &info)
CInfoCache_Base(CInfoManager::TMainMutex &mutex)
void x_SetUnused(CInfo_Base &info)
CInfoManager::TMainMutex TMainMutex
bool x_Check(const vector< const CInfo_Base * > &infos) const
void x_AcquireLoadLock(TCacheMutex::TWriteLockGuard &guard, CInfoRequestorLock &lock, EDoNotWait do_not_wait)
void x_AddToGCQueue(CInfo_Base &info)
void SetMaxGCQueueSize(size_t max_size)
void x_AcquireLoadLock(TMainMutex::TWriteLockGuard &guard, CInfoLock_Base &lock, EDoNotWait do_not_wait)
virtual void x_ForgetInfo(CInfo_Base &info)=0
virtual ~CInfoCache_Base(void)
CInfo_Base::TGCQueue TGCQueue
CInfoLock< DataType > TInfoLock
CInfo_Base::TExpirationTime TExpirationTime
CInfoCache(CInfoManager::TMainMutex &mutex)
CInfoCache(CInfoManager::TMainMutex &mutex, size_t max_size)
TInfoLock GetLoadLock(CInfoRequestor &requestor, const key_type &key, EDoNotWait do_not_wait=eAllowWaiting)
bool MarkLoading(CInfoRequestor &requestor, const key_type &key)
bool SetLoaded(CInfoRequestor &requestor, const key_type &key, const data_type &value, EExpirationType type)
bool IsLoaded(CInfoRequestor &requestor, const key_type &key)
virtual void x_ForgetInfo(CInfo_Base &info_base)
map< key_type, CRef< TInfo > > TIndex
bool SetLoadedFor(CInfoRequestor &requestor, const key_type &key, const data_type &value, TExpirationTime expiration_time)
TInfoLock GetLoaded(CInfoRequestor &requestor, const key_type &key)
TExpirationTime GetNewExpirationTime(EExpirationType type) const
bool SetLoaded(EExpirationType type)
bool IsLoaded(void) const
TExpirationTime GetExpirationTime(void) const
CInfoRequestor & GetRequestor(void) const
bool x_SetLoadedFor(TDataMutex::TWriteLockGuard &, TExpirationTime expiration_time)
SSystemMutex & GetDataLock(void) const
bool x_SetLoaded(TDataMutex::TWriteLockGuard &, EExpirationType type)
bool IsLocked(void) const
DECLARE_OPERATOR_BOOL_REF(m_Lock)
CInfo_Base & GetInfo(void) const
DECLARE_CLASS_STATIC_MUTEX(sm_DataMutex)
bool SetLoadedFor(TExpirationTime expiration_time)
CRef< CInfoRequestorLock > m_Lock
CInfo_Base::TExpirationTime TExpirationTime
TInfo & GetInfo(void) const
CInfo_DataBase< DataType > TInfo
bool SetLoadedFor(const TData &data, TExpirationTime expiration_time)
TData GetData(void) const
bool SetLoaded(const TData &data, EExpirationType type)
void x_LockInfoMutex(CInfoRequestorLock &lock)
bool x_DeadLock(const CInfoRequestor &requestor, const CInfo_Base &info) const
CFastMutex m_DeadlockMutex
void x_AcquireLoadLock(TMainMutex::TWriteLockGuard &guard, CInfoRequestorLock &lock, EDoNotWait do_not_wait)
void x_UnlockInfoMutex(CInfoRequestorLock &lock)
vector< CRef< CLoadMutex > > TLoadMutexPool
void ReleaseLoadLock(CInfoRequestorLock &lock)
TMainMutex & GetMainMutex(void)
TLoadMutexPool m_LoadMutexPool
virtual ~CInfoManager(void)
void x_ReleaseLoadLock(CInfoRequestorLock &lock)
bool x_WaitForOtherLoader(TMainMutex::TWriteLockGuard &guard, CInfoRequestorLock &lock)
void ReleaseAllLoadLocks(CInfoRequestor &requestor)
void x_ReleaseLoadMutex(CRef< CLoadMutex > &mutex)
void x_AssignLoadMutex(CRef< CLoadMutex > &mutex)
CInfoManager & GetManager(void) const
bool SetLoadedFor(TExpirationTime new_expiration_time)
CRef< CLoadMutex > m_Mutex
CInfoRequestor & GetRequestor(void) const
CInfo_Base::TExpirationTime TExpirationTime
bool SetLoaded(EExpirationType type)
bool x_SetLoaded(TMainMutex::TWriteLockGuard &guard, EExpirationType type)
CInfoRequestor & m_Requestor
CInfoRequestorLock(CInfoRequestor &requestor, CInfo_Base &info)
TExpirationTime GetNewExpirationTime(EExpirationType type) const
CInfo_Base & GetInfo(void) const
~CInfoRequestorLock(void)
CRef< CInfo_Base > m_Info
bool IsLoaded(void) const
bool IsLocked(void) const
bool x_SetLoadedFor(TMainMutex::TWriteLockGuard &guard, TExpirationTime new_expiration_time)
TExpirationTime GetExpirationTime(void) const
CInfoRequestor(CInfoManager &manager)
virtual TExpirationTime GetRequestTime(void) const =0
CInfo_Base::TExpirationTime TExpirationTime
unordered_map< CInfoCache_Base *, vector< CInfo_Base * >, PtrHash > TCacheMap
void ReleaseAllLoadLocks(void)
void ReleaseAllUsedInfos(void)
unordered_map< CInfo_Base *, CRef< CInfoRequestorLock >, PtrHash > TLockMap
void ReleaseLoadLock(CInfoRequestorLock &lock)
CRef< CInfoManager > m_Manager
CRef< CInfo_Base > m_WaitingForInfo
virtual TExpirationTime GetNewExpirationTime(EExpirationType type) const =0
virtual ~CInfoRequestor(void)
CInfoManager & GetManager(void) const
CRef< CInfoRequestorLock > x_GetLock(CInfoCache_Base &cache, CInfo_Base &info)
CInfo_Base(TGCQueue &gc_queue)
bool IsLoaded(TExpirationTime expiration_time) const
list< CRef< CInfo_Base > > TGCQueue
atomic< TExpirationTime > m_ExpirationTime
CRef< CLoadMutex > m_LoadMutex
TGCQueue::iterator m_GCQueuePos
virtual ~CInfo_Base(void)
TExpirationTime GetExpirationTime(void) const
CInfo_DataBase(typename CInfo_Base::TGCQueue &gc_queue)
bool IsLoading(void) const
atomic< CInfoRequestor * > m_LoadingRequestor
INoCopying(const INoCopying &)=delete
void operator=(const INoCopying &)=delete
container_type::iterator iterator
const_iterator end() const
const_iterator find(const key_type &key) const
Include a standard set of the NCBI C++ Toolkit most basic headers.
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
bool NotNull(void) const THROWS_NONE
Check if pointer is not null – same effect as NotEmpty().
TObjectType & GetNCObject(void) const
Get object.
uint32_t Uint4
4-byte (32-bit) unsigned integer
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define END_SCOPE(ns)
End the previously defined scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
#define BEGIN_SCOPE(ns)
Define a new scope.
CMutexGuard TWriteLockGuard
Define Write Lock Guard.
const struct ncbi::grid::netcache::search::fields::KEY key
Multi-threading – mutexes; rw-locks; semaphore.
Portable reference counted smart and weak pointers using CWeakRef, CRef, CObject and CObjectEx.
Defines: CTimeFormat - storage class for time format.
size_t operator()(const void *ptr) const