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

Unified Diff: webkit/fileapi/syncable/local_file_sync_context.cc

Issue 11235027: Wire up Syncable operation runner to the local file sync context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased on top of http://codereview.chromium.org/11238054/ Created 8 years, 2 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: webkit/fileapi/syncable/local_file_sync_context.cc
diff --git a/webkit/fileapi/syncable/local_file_sync_context.cc b/webkit/fileapi/syncable/local_file_sync_context.cc
index 531e67fdaefa89b665d532416539737a7953ac9d..cf7a3e8278c8c4abb5ea1c3843bd3a9d59bea19c 100644
--- a/webkit/fileapi/syncable/local_file_sync_context.cc
+++ b/webkit/fileapi/syncable/local_file_sync_context.cc
@@ -5,13 +5,13 @@
#include "webkit/fileapi/syncable/local_file_sync_context.h"
#include "base/bind.h"
-#include "base/callback.h"
#include "base/location.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
#include "base/task_runner_util.h"
#include "webkit/fileapi/file_system_context.h"
#include "webkit/fileapi/file_system_task_runners.h"
+#include "webkit/fileapi/syncable/file_change.h"
#include "webkit/fileapi/syncable/local_file_change_tracker.h"
#include "webkit/fileapi/syncable/syncable_file_operation_runner.h"
@@ -25,7 +25,8 @@ LocalFileSyncContext::LocalFileSyncContext(
base::SingleThreadTaskRunner* ui_task_runner,
base::SingleThreadTaskRunner* io_task_runner)
: ui_task_runner_(ui_task_runner),
- io_task_runner_(io_task_runner) {
+ io_task_runner_(io_task_runner),
+ shutdown_on_ui_(false) {
DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
}
@@ -58,12 +59,61 @@ void LocalFileSyncContext::MaybeInitializeFileSystemContext(
void LocalFileSyncContext::ShutdownOnUIThread() {
DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ shutdown_on_ui_ = true;
io_task_runner_->PostTask(
FROM_HERE,
base::Bind(&LocalFileSyncContext::ShutdownOnIOThread,
this));
}
+void LocalFileSyncContext::PrepareForSync(
+ const FileSystemURL& url,
+ const ChangeListCallback& callback) {
+ // This is initially called on UI thread and to be relayed to IO thread.
+ if (!io_task_runner_->RunsTasksOnCurrentThread()) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ io_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&LocalFileSyncContext::PrepareForSync, this, url, callback));
+ return;
+ }
+ DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
tzik 2012/10/24 03:45:13 I think this is a bit too redundant.
kinuko 2012/10/24 09:39:56 I may prefer keeping this as we chatted offline.
+ if (sync_status()->IsWriting(url)) {
+ ui_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(callback, SYNC_STATUS_FILE_BUSY, FileChangeList()));
+ return;
+ }
+ sync_status()->StartSyncing(url);
+ ui_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&LocalFileSyncContext::DidDisabledWritesForPrepareForSync,
+ this, url, callback));
+}
+
+void LocalFileSyncContext::RegisterURLForWaitingSync(
+ const FileSystemURL& url,
+ const URLCallback& on_syncable_callback) {
+ // This is initially called on UI thread and to be relayed to IO thread.
+ if (!io_task_runner_->RunsTasksOnCurrentThread()) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ io_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&LocalFileSyncContext::RegisterURLForWaitingSync,
+ this, url, on_syncable_callback));
+ return;
+ }
+ DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
+ if (sync_status()->IsWritable(url)) {
+ // No need to register; fire the callback now.
+ ui_task_runner_->PostTask(FROM_HERE, base::Bind(on_syncable_callback, url));
+ return;
+ }
+ DCHECK(url_syncable_callback_.is_null());
+ url_waiting_sync_on_io_ = url;
+ url_syncable_callback_ = on_syncable_callback;
+}
+
base::WeakPtr<SyncableFileOperationRunner>
LocalFileSyncContext::operation_runner() const {
DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
@@ -77,6 +127,23 @@ LocalFileSyncStatus* LocalFileSyncContext::sync_status() const {
return sync_status_.get();
}
+void LocalFileSyncContext::OnSyncEnabled(const FileSystemURL& url) {
+ DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
+ if (url_syncable_callback_.is_null() ||
+ sync_status()->IsWriting(url_waiting_sync_on_io_))
+ return;
+ // TODO(kinuko): may want to check how many pending tasks we have.
+ sync_status()->StartSyncing(url_waiting_sync_on_io_);
+ ui_task_runner_->PostTask(FROM_HERE,
+ base::Bind(url_syncable_callback_,
+ url_waiting_sync_on_io_));
+ url_syncable_callback_.Reset();
+}
+
+void LocalFileSyncContext::OnWriteEnabled(const FileSystemURL& url) {
+ DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
tzik 2012/10/24 03:45:13 could you add TODO comment?
kinuko 2012/10/24 09:39:56 I have no plan to add anything for now.. :) will a
+}
+
LocalFileSyncContext::~LocalFileSyncContext() {
}
@@ -114,6 +181,7 @@ void LocalFileSyncContext::InitializeFileSystemContextOnIOThread(
operation_runner_.reset(new SyncableFileOperationRunner(
kMaxConcurrentSyncableOperation,
sync_status_.get()));
+ sync_status_->AddObserver(this);
}
file_system_context->set_sync_context(this);
DidInitialize(source_url, file_system_context, SYNC_STATUS_OK);
@@ -175,4 +243,22 @@ void LocalFileSyncContext::DidInitialize(
pending_initialize_callbacks_.erase(file_system_context);
}
+void LocalFileSyncContext::DidDisabledWritesForPrepareForSync(
+ const FileSystemURL& url,
+ const ChangeListCallback& callback) {
+ DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
+ if (shutdown_on_ui_) {
+ callback.Run(SYNC_STATUS_ABORT, FileChangeList());
+ return;
+ }
+ DCHECK(ContainsKey(origin_to_contexts_, url.origin()));
+ FileSystemContext* context = origin_to_contexts_[url.origin()];
+ DCHECK(context);
+ DCHECK(context->change_tracker());
+
+ FileChangeList changes;
+ context->change_tracker()->GetChangesForURL(url, &changes);
+ callback.Run(SYNC_STATUS_OK, changes);
+}
+
} // namespace fileapi
« no previous file with comments | « webkit/fileapi/syncable/local_file_sync_context.h ('k') | webkit/fileapi/syncable/local_file_sync_context_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698