mirror of https://github.com/kiwix/libkiwix.git
Use a set of id as key for a the searcher Cache.
It will allow use to cache seacher for multiple zim files.
This commit is contained in:
parent
f5af0633ec
commit
fd0edbba80
|
@ -59,6 +59,27 @@ bool booksReferToTheSameArchive(const Book& book1, const Book& book2)
|
||||||
&& book1.getPath() == book2.getPath();
|
&& book1.getPath() == book2.getPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Key, typename Value>
|
||||||
|
class MultiKeyCache: public ConcurrentCache<std::set<Key>, Value>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit MultiKeyCache(size_t maxEntries)
|
||||||
|
: ConcurrentCache<std::set<Key>, Value>(maxEntries)
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool drop(const Key& key)
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> l(this->lock_);
|
||||||
|
bool removed = false;
|
||||||
|
for(auto& cache_key: this->impl_.keys()) {
|
||||||
|
if(cache_key.find(key)!=cache_key.end()) {
|
||||||
|
removed |= this->impl_.drop(cache_key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return removed;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
} // unnamed namespace
|
} // unnamed namespace
|
||||||
|
|
||||||
struct Library::Impl
|
struct Library::Impl
|
||||||
|
@ -72,7 +93,7 @@ struct Library::Impl
|
||||||
std::map<std::string, Entry> m_books;
|
std::map<std::string, Entry> m_books;
|
||||||
using ArchiveCache = ConcurrentCache<std::string, std::shared_ptr<zim::Archive>>;
|
using ArchiveCache = ConcurrentCache<std::string, std::shared_ptr<zim::Archive>>;
|
||||||
std::unique_ptr<ArchiveCache> mp_archiveCache;
|
std::unique_ptr<ArchiveCache> mp_archiveCache;
|
||||||
using SearcherCache = ConcurrentCache<std::string, std::shared_ptr<zim::Searcher>>;
|
using SearcherCache = MultiKeyCache<std::string, std::shared_ptr<zim::Searcher>>;
|
||||||
std::unique_ptr<SearcherCache> mp_searcherCache;
|
std::unique_ptr<SearcherCache> mp_searcherCache;
|
||||||
std::vector<kiwix::Bookmark> m_bookmarks;
|
std::vector<kiwix::Bookmark> m_bookmarks;
|
||||||
Xapian::WritableDatabase m_bookDB;
|
Xapian::WritableDatabase m_bookDB;
|
||||||
|
@ -285,8 +306,9 @@ std::shared_ptr<zim::Archive> Library::getArchiveById(const std::string& id)
|
||||||
|
|
||||||
std::shared_ptr<zim::Searcher> Library::getSearcherById(const std::string& id)
|
std::shared_ptr<zim::Searcher> Library::getSearcherById(const std::string& id)
|
||||||
{
|
{
|
||||||
|
std::set<std::string> ids {id};
|
||||||
try {
|
try {
|
||||||
return mp_impl->mp_searcherCache->getOrPut(id,
|
return mp_impl->mp_searcherCache->getOrPut(ids,
|
||||||
[&](){
|
[&](){
|
||||||
auto archive = getArchiveById(id);
|
auto archive = getArchiveById(id);
|
||||||
if(!archive) {
|
if(!archive) {
|
||||||
|
|
|
@ -90,7 +90,7 @@ public: // types
|
||||||
return impl_.setMaxSize(new_size);
|
return impl_.setMaxSize(new_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
private: // data
|
protected: // data
|
||||||
Impl impl_;
|
Impl impl_;
|
||||||
std::mutex lock_;
|
std::mutex lock_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -144,6 +144,14 @@ public: // functions
|
||||||
return previous;
|
return previous;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::set<key_t> keys() const {
|
||||||
|
std::set<key_t> keys;
|
||||||
|
for(auto& item:_cache_items_map) {
|
||||||
|
keys.insert(item.first);
|
||||||
|
}
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
private: // functions
|
private: // functions
|
||||||
void putMissing(const key_t& key, const value_t& value) {
|
void putMissing(const key_t& key, const value_t& value) {
|
||||||
assert(_cache_items_map.find(key) == _cache_items_map.end());
|
assert(_cache_items_map.find(key) == _cache_items_map.end());
|
||||||
|
|
Loading…
Reference in New Issue