Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(552)

Unified Diff: chrome/browser/chromeos/extensions/external_pref_cache_loader.cc

Issue 79363004: Merge 235370 "Destroy ExternalCacheDispatcher when last External..." (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1700/src/
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698