Index: chrome/browser/sync/glue/shared_change_processor.h |
diff --git a/chrome/browser/sync/glue/shared_change_processor.h b/chrome/browser/sync/glue/shared_change_processor.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..705359f5b40ba246bcbb4f344486f9732248f757 |
--- /dev/null |
+++ b/chrome/browser/sync/glue/shared_change_processor.h |
@@ -0,0 +1,83 @@ |
+// Copyright (c) 2011 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_GLUE_SHARED_CHANGE_PROCESSOR_H_ |
+#define CHROME_BROWSER_SYNC_GLUE_SHARED_CHANGE_PROCESSOR_H_ |
+#pragma once |
+ |
+#include "base/memory/ref_counted.h" |
+#include "base/synchronization/lock.h" |
+#include "chrome/browser/sync/glue/generic_change_processor.h" |
+#include "content/browser/browser_thread.h" |
+ |
+class SyncData; |
+class SyncableService; |
+ |
+typedef std::vector<SyncData> SyncDataList; |
+ |
+namespace browser_sync { |
+ |
+ |
+// A ref-counted GenericChangeProcessor for use with datatypes that don't live |
+// on the UI thread. We need to make it refcounted as the ownership transfer |
+// from the DataTypeController is dependent on threading, and hence racy. |
+// The SharedChangeProcessor should be created and destroyed on the UI thread, |
+// but should only be connected and used on the same thread as the datatype it |
+// interacts with. The only thread-safe method is Disconnect, which will |
+// disconnect the change processor from the syncer, letting us shut down the |
+// syncer/datatype without waiting for non-UI threads. |
+class SharedChangeProcessor |
+ : public GenericChangeProcessor, |
akalin
2011/10/07 20:51:16
I think this shouldn't inherit from GenericChangeP
Nicolas Zea
2011/10/07 22:05:52
My main reason was that we want to access protecte
akalin
2011/10/07 22:18:28
What protected methods do you need? I only see th
|
+ public base::RefCountedThreadSafe<SharedChangeProcessor, |
+ BrowserThread::DeleteOnUIThread> { |
akalin
2011/10/07 20:51:16
any reason why this is DeleteOnUIThread?
Nicolas Zea
2011/10/07 22:05:52
So that we have some determinism as to which threa
akalin
2011/10/07 22:18:28
The problem is that DeleteOnUIThread is a guarante
|
+ public: |
+ // Create an uninitialized change processor (to be later connected). |
+ explicit SharedChangeProcessor(UnrecoverableErrorHandler* error_handler); |
+ |
+ // Connect to the syncer and the SyncableService specified. Should be called |
+ // on the same thread the datatype resides. |
+ virtual void Connect(SyncableService* local_service, |
+ sync_api::UserShare* user_share); |
+ |
+ // Disconnects from the syncer. May be called from any thread. After this, all |
+ // attempts to interact with the change processor by |local_service_| are |
+ // dropped and return errors. The syncer will be safe to shut down from the |
+ // point of view of this datatype. |
+ // Note: Once disconnected, you cannot reconnect without creating a new |
akalin
2011/10/07 20:51:16
can we provide a stronger guarantee? Will this be
Nicolas Zea
2011/10/07 22:05:52
Yes, this will be called on the UI thread. What gu
akalin
2011/10/07 22:18:28
Ah, right. I'm not sure I like the lock that much
|
+ // change processor. |
+ virtual void Disconnect(); |
+ |
+ // GenericChangeProcessor implementation (with disconnect support). |
+ // Should only be called on the same thread the datatype resides. |
+ virtual SyncError ProcessSyncChanges( |
+ const tracked_objects::Location& from_here, |
+ const SyncChangeList& change_list) OVERRIDE; |
+ virtual SyncError GetSyncDataForType(syncable::ModelType type, |
+ SyncDataList* current_sync_data); |
+ virtual bool SyncModelHasUserCreatedNodes(syncable::ModelType type, |
+ bool* has_nodes); |
+ virtual bool CryptoReadyIfNecessary(syncable::ModelType type); |
+ |
+ protected: |
+ friend class base::RefCountedThreadSafe<SharedChangeProcessor>; |
+ friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; |
+ friend class DeleteTask<SharedChangeProcessor>; |
+ |
+ virtual ~SharedChangeProcessor() OVERRIDE; |
+ |
+ private: |
+ // Monitor lock for this object. All methods that interact with the Syncer |
+ // must aquire this lock and check whether we're disconnected or not. Once |
+ // disconnected, all attempted changes to or loads from the syncer return |
+ // errors. This enables us to shut down the syncer without having to wait |
+ // for possibly non-UI thread datatypes to complete work. |
+ base::Lock monitor_lock_; |
+ bool disconnected_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SharedChangeProcessor); |
+}; |
+ |
+} // namespace browser_sync |
+ |
+#endif // CHROME_BROWSER_SYNC_GLUE_SHARED_CHANGE_PROCESSOR_H_ |