Commit 9d776210 authored by Pavel Vainerman's avatar Pavel Vainerman

(UInterface): убрал использование "дорогого" timestamp в кэше, перешёл на подсчёт обращений.

parent 780ac8b6
...@@ -256,12 +256,12 @@ class UInterface ...@@ -256,12 +256,12 @@ class UInterface
class CacheOfResolve class CacheOfResolve
{ {
public: public:
CacheOfResolve(unsigned int maxsize, int cleantime): CacheOfResolve( unsigned int maxsize, int cleancount=20 ):
MaxSize(maxsize), CleanTime(cleantime){}; MaxSize(maxsize), minCallCount(cleancount){};
~CacheOfResolve(){}; ~CacheOfResolve(){};
UniSetTypes::ObjectPtr resolve( const UniSetTypes::ObjectId id, const UniSetTypes::ObjectId node ) const throw(UniSetTypes::NameNotFound); UniSetTypes::ObjectPtr resolve( const UniSetTypes::ObjectId id, const UniSetTypes::ObjectId node ) const throw(UniSetTypes::NameNotFound);
void cache( const UniSetTypes::ObjectId id, const UniSetTypes::ObjectId node, UniSetTypes::ObjectVar ptr )const; void cache( const UniSetTypes::ObjectId id, const UniSetTypes::ObjectId node, UniSetTypes::ObjectVar ptr ) const;
void erase( const UniSetTypes::ObjectId id, const UniSetTypes::ObjectId node ) const; void erase( const UniSetTypes::ObjectId id, const UniSetTypes::ObjectId node ) const;
inline void setMaxSize( unsigned int ms ) inline void setMaxSize( unsigned int ms )
...@@ -269,66 +269,37 @@ class UInterface ...@@ -269,66 +269,37 @@ class UInterface
MaxSize = ms; MaxSize = ms;
}; };
// void setCleanTime();
protected: protected:
CacheOfResolve(){}; CacheOfResolve(){};
private: private:
bool clean(); /*!< функция очистки кэш-а от старых ссылок */ bool clean(); /*!< функция очистки кэш-а от старых ссылок */
inline void clear() /*!< удаление всей информации */ inline void clear() /*!< удаление всей информации */
{ {
UniSetTypes::uniset_rwmutex_wrlock l(cmutex); UniSetTypes::uniset_rwmutex_wrlock l(cmutex);
mcache.clear(); mcache.clear();
}; };
/*!
\todo можно добавить поле CleanTime для каждой ссылки отдельно...
*/
struct Info struct Info
{ {
Info( UniSetTypes::ObjectVar ptr, time_t tm=0 ): Info( UniSetTypes::ObjectVar ptr ):ptr(ptr),ncall(0){}
ptr(ptr) Info():ptr(NULL),ncall(0){}
{
if(!tm)
timestamp = time(NULL);
}
Info():
ptr(NULL), timestamp(0){};
UniSetTypes::ObjectVar ptr; UniSetTypes::ObjectVar ptr;
time_t timestamp; // время последнего обращения unsigned long ncall; // счётчик обращений
bool operator<( const CacheOfResolve::Info& rhs ) const bool operator<( const CacheOfResolve::Info& rhs ) const
{ {
return this->timestamp < rhs.timestamp; return this->ncall > rhs.ncall;
} }
}; };
typedef std::map<int, Info> CacheMap; typedef std::map<int, Info> CacheMap;
mutable CacheMap mcache; mutable CacheMap mcache;
mutable UniSetTypes::uniset_rwmutex cmutex; mutable UniSetTypes::uniset_rwmutex cmutex;
unsigned int MaxSize; /*!< максимальный размер кэша */ unsigned int MaxSize; /*!< максимальный размер кэша */
unsigned int CleanTime; /*!< период устаревания ссылок [мин] */ unsigned int minCallCount; /*!< минимальное количество вызовов, меньше которого ссылка считается устаревшей */
/*
// В последствии написать функцию для использования
// remove_if
typedef std::pair<int, Info> CacheItem;
// функция-объект для поиска устаревших(по времени) ссылок
struct OldRef_eq: public unary_function<CacheItem, bool>
{
OldRef_eq(time_t tm):tm(tm){}
bool operator()( const CacheItem& inf ) const
{
return inf.timestamp < tm;
}
time_t tm;
};
*/
}; };
void initBackId( UniSetTypes::ObjectId backid ); void initBackId( UniSetTypes::ObjectId backid );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment