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

Unified Diff: chrome/browser/sync/glue/chrome_sync_notification_bridge.h

Issue 10808040: [Sync] Avoid ObserverListThreadSafe in ChromeSyncNotificationBridge (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 8 years, 5 months 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/sync/glue/chrome_sync_notification_bridge.h
diff --git a/chrome/browser/sync/glue/chrome_sync_notification_bridge.h b/chrome/browser/sync/glue/chrome_sync_notification_bridge.h
index cc133bdf1cd5df5486aa689110be617686b720a8..938d91e2dda46aaa291e4f8392e68a7eefcfd90e 100644
--- a/chrome/browser/sync/glue/chrome_sync_notification_bridge.h
+++ b/chrome/browser/sync/glue/chrome_sync_notification_bridge.h
@@ -7,7 +7,7 @@
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
-#include "base/observer_list_threadsafe.h"
+#include "base/sequenced_task_runner.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "sync/internal_api/public/base/model_type.h"
@@ -20,21 +20,25 @@ class SyncNotifierObserver;
namespace browser_sync {
-// A thread-safe bridge for chrome events that can trigger sync notifications.
+// A bridge that converts Chrome events on the UI thread to sync
+// notifications on the sync task runner.
+//
// Listens to NOTIFICATION_SYNC_REFRESH_LOCAL and
-// NOTIFICATION_SYNC_REFRESH_REMOTE and triggers each observer's
-// OnIncomingNotification method on these notifications.
-// Note: Notifications are expected to arrive on the UI thread, but observers
-// may live on any thread.
+// NOTIFICATION_SYNC_REFRESH_REMOTE (on the UI thread) and triggers
+// each observer's OnIncomingNotification method on these
+// notifications (on the sync task runner).
class ChromeSyncNotificationBridge : public content::NotificationObserver {
public:
- explicit ChromeSyncNotificationBridge(const Profile* profile);
+ // Must be created and destroyed on the UI thread.
+ ChromeSyncNotificationBridge(
+ const Profile* profile,
+ const scoped_refptr<base::SequencedTaskRunner>& sync_task_runner);
virtual ~ChromeSyncNotificationBridge();
- // Must be called on UI thread.
+ // Must be called on the UI thread.
void UpdateEnabledTypes(const syncer::ModelTypeSet enabled_types);
- // These can be called on any thread.
+ // Must be called on the sync task runner.
virtual void AddObserver(syncer::SyncNotifierObserver* observer);
virtual void RemoveObserver(syncer::SyncNotifierObserver* observer);
@@ -44,13 +48,17 @@ class ChromeSyncNotificationBridge : public content::NotificationObserver {
const content::NotificationDetails& details) OVERRIDE;
private:
+ // Inner class to hold all the bits used on |sync_task_runner_|.
+ class Core;
+
+ const scoped_refptr<base::SequencedTaskRunner> sync_task_runner_;
+
+ // Created on the UI thread, used only on |sync_task_runner_|.
+ const scoped_refptr<Core> core_;
+
+ // Used only on the UI thread.
content::NotificationRegistrar registrar_;
syncer::ModelTypeSet enabled_types_;
-
- // Because [Add/Remove]Observer can be called from any thread, we need a
- // thread-safe observerlist.
- scoped_refptr<ObserverListThreadSafe<syncer::SyncNotifierObserver> >
- observers_;
};
} // namespace browser_sync

Powered by Google App Engine
This is Rietveld 408576698