Index: chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_engine.cc b/chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
index be3a51a18477c1f3ae973dd9d3b7ed15d643fffe..e1c79cd59d39c80c50b2ea5dff3b10694332a901 100644 |
--- a/chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
+++ b/chrome/browser/sync_file_system/drive_backend/sync_engine.cc |
@@ -8,6 +8,7 @@ |
#include "base/bind.h" |
#include "base/metrics/histogram.h" |
+#include "base/run_loop.h" |
#include "base/threading/sequenced_worker_pool.h" |
#include "base/time/time.h" |
#include "base/values.h" |
@@ -66,7 +67,6 @@ class SyncEngine::WorkerObserver : public SyncWorker::Observer { |
base::WeakPtr<SyncEngine> sync_engine) |
: ui_task_runner_(ui_task_runner), |
sync_engine_(sync_engine) {} |
- |
virtual ~WorkerObserver() {} |
virtual void OnPendingFileListUpdated(int item_count) OVERRIDE { |
@@ -183,9 +183,12 @@ scoped_ptr<SyncEngine> SyncEngine::CreateForBrowserContext( |
notification_manager, |
extension_service, |
signin_manager)); |
+ base::RunLoop run_loop; |
sync_engine->Initialize(GetSyncFileSystemDir(context->GetPath()), |
file_task_runner.get(), |
+ run_loop.QuitClosure(), |
NULL); |
+ run_loop.Run(); |
nhiroki
2014/05/26 05:31:32
Hmm... this can block the UI thread?
|
return sync_engine.Pass(); |
} |
@@ -205,11 +208,17 @@ SyncEngine::~SyncEngine() { |
if (notification_manager_) |
notification_manager_->RemoveObserver(this); |
- // TODO(tzik): Destroy |sync_worker_| and |worker_observer_| on the worker. |
+ worker_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &SyncWorker::DestructOnWorker, |
+ base::Passed(&sync_worker_), |
+ base::Passed(worker_observer_.PassAs<SyncWorker::Observer>()))); |
} |
void SyncEngine::Initialize(const base::FilePath& base_dir, |
base::SequencedTaskRunner* file_task_runner, |
+ const base::Closure& closure, |
leveldb::Env* env_override) { |
// DriveServiceWrapper and DriveServiceOnWorker relay communications |
// between DriveService and syncers in SyncWorker. |
@@ -239,18 +248,23 @@ void SyncEngine::Initialize(const base::FilePath& base_dir, |
if (extension_service_) |
extension_service_weak_ptr = extension_service_->AsWeakPtr(); |
- // TODO(peria): Use PostTask on |worker_task_runner_| to call this function. |
- sync_worker_ = SyncWorker::CreateOnWorker( |
- base_dir, |
- worker_observer_.get(), |
- extension_service_weak_ptr, |
- sync_engine_context.Pass(), |
- env_override); |
- |
if (notification_manager_) |
notification_manager_->AddObserver(this); |
GetDriveService()->AddObserver(this); |
net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
nhiroki
2014/05/26 05:22:44
I haven't read sourcecode closely, but I guess the
peria
2014/05/26 05:32:35
Done.
Yes, those observers communicate with SyncWo
|
+ |
+ PostTaskAndReplyWithResult( |
+ worker_task_runner_, |
+ FROM_HERE, |
+ base::Bind(&SyncWorker::CreateOnWorker, |
+ base_dir, |
+ worker_observer_.get(), |
+ extension_service_weak_ptr, |
+ base::Passed(sync_engine_context.Pass()), |
+ env_override), |
+ base::Bind(&SyncEngine::SetSyncWorker, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ closure)); |
} |
void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) { |
@@ -545,5 +559,11 @@ void SyncEngine::UpdateRegisteredApps() { |
} |
} |
+void SyncEngine::SetSyncWorker(const base::Closure& closure, |
+ scoped_ptr<SyncWorker> sync_worker) { |
+ sync_worker_ = sync_worker.Pass(); |
+ closure.Run(); |
+} |
+ |
} // namespace drive_backend |
} // namespace sync_file_system |