From b265927501abeebd33b9da431e4899eedfbffb27 Mon Sep 17 00:00:00 2001 From: Allan Odgaard Date: Tue, 16 Sep 2014 14:22:54 +0200 Subject: [PATCH] Perform cache invalidation for value_for_setting cache --- Frameworks/bundles/src/wrappers.cc | 31 ++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Frameworks/bundles/src/wrappers.cc b/Frameworks/bundles/src/wrappers.cc index bb8763a8..b804e2a6 100644 --- a/Frameworks/bundles/src/wrappers.cc +++ b/Frameworks/bundles/src/wrappers.cc @@ -187,20 +187,35 @@ namespace bundles plist::any_t value_for_setting (std::string const& setting, scope::context_t const& scope, item_ptr* match) { - static std::map cache; + struct cache_t : bundles::callback_t + { + cache_t () + { + bundles::add_callback(this); + } - static std::mutex mutex; - std::lock_guard lock(mutex); + void bundles_did_change () + { + std::lock_guard lock(mutex); + map.clear(); + } + + std::map map; + std::mutex mutex; + }; + + static cache_t cache; + std::lock_guard lock(cache.mutex); std::string const key = setting + "\037" + to_s(scope); - auto iter = cache.find(key); - if(iter == cache.end()) + auto iter = cache.map.find(key); + if(iter == cache.map.end()) { - if(cache.size() > 1000) - cache.clear(); + if(cache.map.size() > 1000) + cache.map.clear(); auto items = query(kFieldSettingName, setting, scope, kItemTypeSettings); - iter = cache.emplace(key, items.empty() ? item_ptr() : items.front()).first; + iter = cache.map.emplace(key, items.empty() ? item_ptr() : items.front()).first; } plist::any_t res;