| Index: chrome/browser/chromeos/extensions/external_pref_cache_loader.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/extensions/external_pref_cache_loader.cc (revision 236318)
|
| +++ chrome/browser/chromeos/extensions/external_pref_cache_loader.cc (working copy)
|
| @@ -10,7 +10,6 @@
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/memory/ref_counted.h"
|
| -#include "base/memory/singleton.h"
|
| #include "base/sequenced_task_runner.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| #include "base/values.h"
|
| @@ -29,13 +28,19 @@
|
| // Directory where the extensions are cached.
|
| const char kPreinstalledAppsCacheDir[] = "/var/cache/external_cache";
|
|
|
| -// Singleton class that holds ExternalCache and dispatches cache update events
|
| +} // namespace
|
| +
|
| +// Ref-counted class that holds ExternalCache and dispatches cache update events
|
| // to per-profile instances of ExternalPrefCacheLoader. This multiplexing
|
| // is required for multi-profile case.
|
| -class ExternalCacheDispatcher : public ExternalCache::Delegate {
|
| +class ExternalCacheDispatcher
|
| + : public ExternalCache::Delegate,
|
| + public base::RefCounted<ExternalCacheDispatcher> {
|
| public:
|
| static ExternalCacheDispatcher* GetInstance() {
|
| - return Singleton<ExternalCacheDispatcher>::get();
|
| + if (!ExternalCacheDispatcher::instance_)
|
| + ExternalCacheDispatcher::instance_ = new ExternalCacheDispatcher;
|
| + return instance_;
|
| }
|
|
|
| // Implementation of ExternalCache::Delegate:
|
| @@ -100,7 +105,7 @@
|
| }
|
|
|
| private:
|
| - friend struct DefaultSingletonTraits<ExternalCacheDispatcher>;
|
| + friend class base::RefCounted<ExternalCacheDispatcher>;
|
|
|
| typedef std::map<ExternalPrefCacheLoader*, Profile*> LoadersMap;
|
|
|
| @@ -117,27 +122,34 @@
|
| true),
|
| base_path_id_(0),
|
| is_extensions_list_ready_(false) {
|
| + DCHECK(!ExternalCacheDispatcher::instance_);
|
| }
|
|
|
| + virtual ~ExternalCacheDispatcher() {
|
| + ExternalCacheDispatcher::instance_ = NULL;
|
| + }
|
| +
|
| ExternalCache external_cache_;
|
| LoadersMap pref_loaders_;
|
| int base_path_id_;
|
| bool is_extensions_list_ready_;
|
|
|
| + static ExternalCacheDispatcher* instance_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(ExternalCacheDispatcher);
|
| };
|
|
|
| -} // namespace
|
| +ExternalCacheDispatcher* ExternalCacheDispatcher::instance_ = NULL;
|
|
|
| ExternalPrefCacheLoader::ExternalPrefCacheLoader(int base_path_id,
|
| Profile* profile)
|
| : ExternalPrefLoader(base_path_id, ExternalPrefLoader::NONE),
|
| - profile_(profile) {
|
| + profile_(profile),
|
| + cache_dispatcher_(ExternalCacheDispatcher::GetInstance()) {
|
| }
|
|
|
| ExternalPrefCacheLoader::~ExternalPrefCacheLoader() {
|
| - ExternalCacheDispatcher::GetInstance()->UnregisterExternalPrefCacheLoader(
|
| - this);
|
| + cache_dispatcher_->UnregisterExternalPrefCacheLoader(this);
|
| }
|
|
|
| void ExternalPrefCacheLoader::OnExtensionListsUpdated(
|
| @@ -147,7 +159,7 @@
|
| }
|
|
|
| void ExternalPrefCacheLoader::StartLoading() {
|
| - if (!ExternalCacheDispatcher::GetInstance()->RegisterExternalPrefCacheLoader(
|
| + if (!cache_dispatcher_->RegisterExternalPrefCacheLoader(
|
| this, base_path_id_, profile_)) {
|
| // ExternalCacheDispatcher doesn't know list of extensions load it.
|
| ExternalPrefLoader::StartLoading();
|
| @@ -155,7 +167,7 @@
|
| }
|
|
|
| void ExternalPrefCacheLoader::LoadFinished() {
|
| - ExternalCacheDispatcher::GetInstance()->UpdateExtensionsList(prefs_.Pass());
|
| + cache_dispatcher_->UpdateExtensionsList(prefs_.Pass());
|
| }
|
|
|
| } // namespace chromeos
|
|
|