@@ -52,8 +52,9 @@ static std::atomic<bool> xa_notify_stop{false};
5252static std::condition_variable xa_thread_wake;
5353static alias_map xa_empty_alias_map;
5454static domain_set xa_empty_domain_set;
55- static std::atomic<std::shared_ptr<alias_map>> xa_alias_map;
56- static std::atomic<std::shared_ptr<domain_set>> xa_domain_set;
55+ static std::shared_ptr<alias_map> xa_alias_map;
56+ static std::shared_ptr<domain_set> xa_domain_set;
57+ static std::mutex xa_alias_lock;
5758static std::thread xa_thread;
5859static mysql_adaptor_init_param g_parm;
5960static std::chrono::seconds g_cache_lifetime;
@@ -155,10 +156,11 @@ static void xa_refresh_once()
155156 auto conn = sql_make_conn ();
156157 auto newmap = xa_refresh_aliases (conn);
157158 auto newdom = xa_refresh_domains (conn);
159+ std::unique_lock lk (xa_alias_lock);
158160 if (newmap != nullptr )
159- xa_alias_map. exchange ( std::move (newmap) );
161+ xa_alias_map = std::move (newmap);
160162 if (newdom != nullptr )
161- xa_domain_set. exchange ( std::move (newdom) );
163+ xa_domain_set = std::move (newdom);
162164}
163165
164166static void xa_refresh_thread ()
@@ -175,8 +177,13 @@ static void xa_refresh_thread()
175177
176178static hook_result xa_alias_subst (MESSAGE_CONTEXT *ctx) try
177179{
178- auto alias_map_ptr = xa_alias_map.load ();
179- auto domset_ptr = xa_domain_set.load ();
180+ decltype (xa_alias_map) alias_map_ptr;
181+ decltype (xa_domain_set) domset_ptr;
182+ {
183+ std::unique_lock lk (xa_alias_lock);
184+ alias_map_ptr = xa_alias_map;
185+ domset_ptr = xa_domain_set;
186+ }
180187 auto &alias_map = alias_map_ptr != nullptr ? *alias_map_ptr : xa_empty_alias_map;
181188 auto &domset = domset_ptr != nullptr ? *domset_ptr : xa_empty_domain_set;
182189
0 commit comments