@@ -36,18 +36,21 @@ struct async_resolver : std::enable_shared_from_this<async_resolver<Tag> > {
3636typedef std::function<void (resolver_type &, string_type, std::uint16_t ,
3737 resolve_completion_function)> resolve_function;
3838
39+ void clear_resolved_cache () { clear_cache_.store (true ); }
40+
3941protected:
4042bool cache_resolved_;
43+ std::atomic<bool > clear_cache_;
4144 endpoint_cache endpoint_cache_;
4245 std::shared_ptr<boost::asio::io_service> service_;
4346 std::shared_ptr<boost::asio::io_service::strand> resolver_strand_;
4447
4548explicit async_resolver (bool cache_resolved)
46- : cache_resolved_(cache_resolved), endpoint_cache_() {}
49+ : cache_resolved_(cache_resolved),clear_cache_( false ), endpoint_cache_() {}
4750
4851void resolve (resolver_type &resolver_, string_typeconst &host,
4952 std::uint16_t port, resolve_completion_function once_resolved) {
50- if (cache_resolved_) {
53+ if (cache_resolved_ && !clear_cache_. load () ) {
5154typename endpoint_cache::iterator iter =
5255 endpoint_cache_.find (boost::to_lower_copy (host));
5356if (iter != endpoint_cache_.end ()) {
@@ -74,6 +77,9 @@ struct async_resolver : std::enable_shared_from_this<async_resolver<Tag> > {
7477typename endpoint_cache::iterator iter;
7578bool inserted =false ;
7679if (!ec && cache_resolved_) {
80+ if (clear_cache_.exchange (false )) {
81+ endpoint_cache_.clear ();
82+ }
7783std::tie (iter, inserted) = endpoint_cache_.insert (std::make_pair (
7884 host,std::make_pair (endpoint_iterator,resolver_iterator ())));
7985once_resolved (ec, iter->second );