Chromium Code Reviews| 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..9874561b17c65752f8278283b1006a396ad71c07 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(); |
| 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( |
|
tzik
2014/05/26 05:41:30
worker_task_runner_->DeleteSoon(); should work.
peria
2014/05/26 06:08:10
Done.
|
| + 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,18 @@ 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); |
| + 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()), |
|
tzik
2014/05/26 05:41:30
s/sync_engine_context.Pass()/&sync_engine_context/
peria
2014/05/26 06:08:10
Done.
|
| + env_override), |
| + base::Bind(&SyncEngine::SetSyncWorker, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + closure)); |
| } |
| void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) { |
| @@ -545,5 +554,17 @@ void SyncEngine::UpdateRegisteredApps() { |
| } |
| } |
| +void SyncEngine::SetSyncWorker(const base::Closure& closure, |
| + scoped_ptr<SyncWorker> sync_worker) { |
| + sync_worker_ = sync_worker.Pass(); |
| + |
| + if (notification_manager_) |
| + notification_manager_->AddObserver(this); |
| + GetDriveService()->AddObserver(this); |
| + net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
| + |
| + closure.Run(); |
| +} |
| + |
| } // namespace drive_backend |
| } // namespace sync_file_system |