@@ -36,18 +36,21 @@ struct async_resolver : std::enable_shared_from_this<async_resolver<Tag> > {
36
36
typedef std::function<void (resolver_type &, string_type, std::uint16_t ,
37
37
resolve_completion_function)> resolve_function;
38
38
39
+ void clear_resolved_cache () { clear_cache_.store (true ); }
40
+
39
41
protected:
40
42
bool cache_resolved_;
43
+ std::atomic<bool > clear_cache_;
41
44
endpoint_cache endpoint_cache_;
42
45
std::shared_ptr<boost::asio::io_service> service_;
43
46
std::shared_ptr<boost::asio::io_service::strand> resolver_strand_;
44
47
45
48
explicit async_resolver (bool cache_resolved)
46
- : cache_resolved_(cache_resolved), endpoint_cache_() {}
49
+ : cache_resolved_(cache_resolved), clear_cache_( false ), endpoint_cache_() {}
47
50
48
51
void resolve (resolver_type &resolver_, string_type const &host,
49
52
std::uint16_t port, resolve_completion_function once_resolved) {
50
- if (cache_resolved_) {
53
+ if (cache_resolved_ && !clear_cache_. load () ) {
51
54
typename endpoint_cache::iterator iter =
52
55
endpoint_cache_.find (boost::to_lower_copy (host));
53
56
if (iter != endpoint_cache_.end ()) {
@@ -74,6 +77,9 @@ struct async_resolver : std::enable_shared_from_this<async_resolver<Tag> > {
74
77
typename endpoint_cache::iterator iter;
75
78
bool inserted = false ;
76
79
if (!ec && cache_resolved_) {
80
+ if (clear_cache_.exchange (false )) {
81
+ endpoint_cache_.clear ();
82
+ }
77
83
std::tie (iter, inserted) = endpoint_cache_.insert (std::make_pair (
78
84
host, std::make_pair (endpoint_iterator, resolver_iterator ())));
79
85
once_resolved (ec, iter->second );
0 commit comments