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

Unified Diff: components/sync_driver/non_blocking_data_type_controller.h

Issue 249843002: Introduce NonBlockingDataTypeController (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix one nit Created 6 years, 8 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
« no previous file with comments | « components/sync_driver.gypi ('k') | components/sync_driver/non_blocking_data_type_controller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/sync_driver/non_blocking_data_type_controller.h
diff --git a/components/sync_driver/non_blocking_data_type_controller.h b/components/sync_driver/non_blocking_data_type_controller.h
new file mode 100644
index 0000000000000000000000000000000000000000..d904903e7f6a13e686517cbeba3837ceeb881b76
--- /dev/null
+++ b/components/sync_driver/non_blocking_data_type_controller.h
@@ -0,0 +1,136 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SYNC_NON_BLOCKING_DATA_TYPE_CONTROLLER_H_
+#define CHROME_BROWSER_SYNC_NON_BLOCKING_DATA_TYPE_CONTROLLER_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequenced_task_runner.h"
+#include "sync/internal_api/public/base/model_type.h"
+#include "sync/internal_api/public/sync_core_proxy.h"
+
+namespace syncer {
+class NonBlockingTypeProcessor;
+}
+
+namespace browser_sync {
+
+// Lives on the UI thread and manages the interactions between many sync
+// components.
+//
+// There are three main parts to this controller:
+// - The SyncCoreProxy, represening the sync thread.
+// - The NonBlockingTypeProcessor, representing the model type thread.
+// - The user-set state for this type (prefs), which lives on the UI thread.
+//
+// The NonBlockingSyncTypeProcessor can exist in three different states. Those
+// states are:
+// - Enabled: Changes are being synced.
+// - Disconnected: Changes would be synced, but there is no connection between
+// the sync thread and the model thread.
+// - Disabled: Syncing is intentionally disabled. The processor may clear any
+// of its local state associated with sync when this happens, since
+// this is expected to last a while.
+//
+// This controller is responsible for transitioning the processor into and out
+// of these states. It does this by posting tasks to the model type thread.
+//
+// The processor is enabled when the user has indicated a desire to sync this
+// type, and the NonBlockingTypeProcessor and SyncCoreProxy are available.
+//
+// The processor is disconnected during initialization, or when either the
+// NonBlockingDataTypeController or SyncCoreProxy have not yet registered. It
+// can also be disconnected later on if the sync backend becomes unavailable.
+//
+// The processor is disabled if the user has disabled sync for this type. The
+// signal indicating this state will be sent to the processor when the pref is
+// first changed, or when the processor first connects to the controller.
+//
+// This class is structured using some state machine patterns. It's a bit
+// awkward at times, but this seems to be the clearest way to express the
+// behaviors this class must implement.
+class NonBlockingDataTypeController {
+ public:
+ NonBlockingDataTypeController(syncer::ModelType type, bool is_preferred);
+ ~NonBlockingDataTypeController();
+
+ // Connects the NonBlockingTypeProcessor to this controller.
+ //
+ // There is no "undo" for this operation. The NonBlockingDataTypeController
+ // will only ever deal with a single processor.
+ void InitializeProcessor(
+ scoped_refptr<base::SequencedTaskRunner> task_runner,
+ base::WeakPtr<syncer::NonBlockingTypeProcessor> processor);
+
+ // Initialize the connection to the SyncCoreProxy.
+ //
+ // This process may be reversed with ClearSyncCoreProxy().
+ void InitializeSyncCoreProxy(scoped_ptr<syncer::SyncCoreProxy> proxy);
+
+ // Disconnect from the current SyncCoreProxy.
+ void ClearSyncCoreProxy();
+
+ // Sets the current preferred state.
+ //
+ // Represents a choice to sync or not sync this type. This is expected to
+ // last a long time, so local state may be deleted if this setting is toggled
+ // to false.
+ void SetIsPreferred(bool is_preferred);
+
+ private:
+ enum TypeProcessorState { ENABLED, DISABLED, DISCONNECTED };
+
+ // Figures out which signals need to be sent then send then sends them.
+ void UpdateState();
+
+ // Sends an enable signal to the NonBlockingTypeProcessor.
+ void SendEnableSignal();
+
+ // Sends a disable signal to the NonBlockingTypeProcessor.
+ void SendDisableSignal();
+
+ // Sends a disconnect signal to the NonBlockingTypeProcessor.
+ void SendDisconnectSignal();
+
+ // Returns true if this type should be synced.
+ bool IsPreferred() const;
+
+ // Returns true if this object has access to the NonBlockingTypeProcessor.
+ bool IsTypeProcessorConnected() const;
+
+ // Returns true if this object has access to the SyncCoreProxy.
+ bool IsSyncBackendConnected() const;
+
+ // Returns the state that the processor *should* be in.
+ TypeProcessorState GetDesiredState() const;
+
+ // The ModelType we're controlling. Kept mainly for debugging.
+ const syncer::ModelType type_;
+
+ // Returns the state that the processor is actually in, from this class'
+ // point of view.
+ //
+ // This state is inferred based on the most recently sent signals, and is
+ // intended to represent the state the processor will be in by the time any
+ // tasks we post to it now will be run. Due to threading / queueing effects,
+ // this may or may not be the actual state at this point in time.
+ TypeProcessorState current_state_;
+
+ // Whether or not the user wants to sync this type.
+ bool is_preferred_;
+
+ // The NonBlockingTypeProcessor and its associated thread. May be NULL.
+ scoped_refptr<base::SequencedTaskRunner> task_runner_;
+ base::WeakPtr<syncer::NonBlockingTypeProcessor> processor_;
+
+ // The SyncCoreProxy that connects to the current sync backend. May be NULL.
+ scoped_ptr<syncer::SyncCoreProxy> proxy_;
+
+ DISALLOW_COPY_AND_ASSIGN(NonBlockingDataTypeController);
+};
+
+} // namespace browser_sync
+
+#endif // CHROME_BROWSER_SYNC_NON_BLOCKING_DATA_TYPE_CONTROLLER_H_
« no previous file with comments | « components/sync_driver.gypi ('k') | components/sync_driver/non_blocking_data_type_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698