diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 812b2bde9..d6e6a91a4 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -633,6 +633,21 @@ std::unique_ptr InternalServer::build_homepage(const RequestContext& r * Archive and Zim handlers begin **/ +class InternalServer::LockableSuggestionSearcher : public zim::SuggestionSearcher +{ + public: + explicit LockableSuggestionSearcher(const zim::Archive& archive) + : zim::SuggestionSearcher(archive) + {} + + std::unique_lock getLock() { + return std::unique_lock(m_mutex); + } + virtual ~LockableSuggestionSearcher() = default; + private: + std::mutex m_mutex; +}; + std::unique_ptr InternalServer::handle_suggest(const RequestContext& request) { if (m_verbose.load()) { @@ -676,8 +691,9 @@ std::unique_ptr InternalServer::handle_suggest(const RequestContext& r /* Get the suggestions */ auto searcher = suggestionSearcherCache.getOrPut(bookId, - [=](){ return make_shared(*archive); } + [=](){ return make_shared(*archive); } ); + const auto lock(searcher->getLock()); auto search = searcher->suggest(queryString); auto srs = search.getResults(start, count); diff --git a/src/server/internalServer.h b/src/server/internalServer.h index a73a7d424..6f523336e 100644 --- a/src/server/internalServer.h +++ b/src/server/internalServer.h @@ -88,9 +88,6 @@ class SearchInfo { typedef kainjow::mustache::data MustacheData; -typedef ConcurrentCache> SearchCache; -typedef ConcurrentCache> SuggestionSearcherCache; - class OPDSDumper; class InternalServer { @@ -157,6 +154,11 @@ class InternalServer { bool isLocallyCustomizedResource(const std::string& url) const; + private: // types + class LockableSuggestionSearcher; + typedef ConcurrentCache> SearchCache; + typedef ConcurrentCache> SuggestionSearcherCache; + private: // data std::string m_addr; int m_port;