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

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/sync_engine.cc

Issue 288193002: [SyncFS] Construct and destruct sync_worker in worker_task_runner (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine.h" 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/run_loop.h"
11 #include "base/threading/sequenced_worker_pool.h" 12 #include "base/threading/sequenced_worker_pool.h"
12 #include "base/time/time.h" 13 #include "base/time/time.h"
13 #include "base/values.h" 14 #include "base/values.h"
14 #include "chrome/browser/drive/drive_api_service.h" 15 #include "chrome/browser/drive/drive_api_service.h"
15 #include "chrome/browser/drive/drive_notification_manager.h" 16 #include "chrome/browser/drive/drive_notification_manager.h"
16 #include "chrome/browser/drive/drive_notification_manager_factory.h" 17 #include "chrome/browser/drive/drive_notification_manager_factory.h"
17 #include "chrome/browser/drive/drive_service_interface.h" 18 #include "chrome/browser/drive/drive_service_interface.h"
18 #include "chrome/browser/drive/drive_uploader.h" 19 #include "chrome/browser/drive/drive_uploader.h"
19 #include "chrome/browser/extensions/extension_service.h" 20 #include "chrome/browser/extensions/extension_service.h"
20 #include "chrome/browser/profiles/profile.h" 21 #include "chrome/browser/profiles/profile.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 class RemoteChangeProcessor; 60 class RemoteChangeProcessor;
60 61
61 namespace drive_backend { 62 namespace drive_backend {
62 63
63 class SyncEngine::WorkerObserver : public SyncWorker::Observer { 64 class SyncEngine::WorkerObserver : public SyncWorker::Observer {
64 public: 65 public:
65 WorkerObserver(base::SequencedTaskRunner* ui_task_runner, 66 WorkerObserver(base::SequencedTaskRunner* ui_task_runner,
66 base::WeakPtr<SyncEngine> sync_engine) 67 base::WeakPtr<SyncEngine> sync_engine)
67 : ui_task_runner_(ui_task_runner), 68 : ui_task_runner_(ui_task_runner),
68 sync_engine_(sync_engine) {} 69 sync_engine_(sync_engine) {}
69
70 virtual ~WorkerObserver() {} 70 virtual ~WorkerObserver() {}
71 71
72 virtual void OnPendingFileListUpdated(int item_count) OVERRIDE { 72 virtual void OnPendingFileListUpdated(int item_count) OVERRIDE {
73 if (ui_task_runner_->RunsTasksOnCurrentThread()) { 73 if (ui_task_runner_->RunsTasksOnCurrentThread()) {
74 sync_engine_->OnPendingFileListUpdated(item_count); 74 sync_engine_->OnPendingFileListUpdated(item_count);
75 return; 75 return;
76 } 76 }
77 77
78 ui_task_runner_->PostTask( 78 ui_task_runner_->PostTask(
79 FROM_HERE, 79 FROM_HERE,
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 scoped_refptr<base::SingleThreadTaskRunner> 176 scoped_refptr<base::SingleThreadTaskRunner>
177 worker_task_runner = base::MessageLoopProxy::current(); 177 worker_task_runner = base::MessageLoopProxy::current();
178 178
179 scoped_ptr<drive_backend::SyncEngine> sync_engine( 179 scoped_ptr<drive_backend::SyncEngine> sync_engine(
180 new SyncEngine(drive_service.Pass(), 180 new SyncEngine(drive_service.Pass(),
181 drive_uploader.Pass(), 181 drive_uploader.Pass(),
182 worker_task_runner, 182 worker_task_runner,
183 notification_manager, 183 notification_manager,
184 extension_service, 184 extension_service,
185 signin_manager)); 185 signin_manager));
186 base::RunLoop run_loop;
186 sync_engine->Initialize(GetSyncFileSystemDir(context->GetPath()), 187 sync_engine->Initialize(GetSyncFileSystemDir(context->GetPath()),
187 file_task_runner.get(), 188 file_task_runner.get(),
189 run_loop.QuitClosure(),
188 NULL); 190 NULL);
191 run_loop.Run();
nhiroki 2014/05/26 05:31:32 Hmm... this can block the UI thread?
189 192
190 return sync_engine.Pass(); 193 return sync_engine.Pass();
191 } 194 }
192 195
193 void SyncEngine::AppendDependsOnFactories( 196 void SyncEngine::AppendDependsOnFactories(
194 std::set<BrowserContextKeyedServiceFactory*>* factories) { 197 std::set<BrowserContextKeyedServiceFactory*>* factories) {
195 DCHECK(factories); 198 DCHECK(factories);
196 factories->insert(drive::DriveNotificationManagerFactory::GetInstance()); 199 factories->insert(drive::DriveNotificationManagerFactory::GetInstance());
197 factories->insert(SigninManagerFactory::GetInstance()); 200 factories->insert(SigninManagerFactory::GetInstance());
198 factories->insert( 201 factories->insert(
199 extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); 202 extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory());
200 } 203 }
201 204
202 SyncEngine::~SyncEngine() { 205 SyncEngine::~SyncEngine() {
203 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); 206 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
204 GetDriveService()->RemoveObserver(this); 207 GetDriveService()->RemoveObserver(this);
205 if (notification_manager_) 208 if (notification_manager_)
206 notification_manager_->RemoveObserver(this); 209 notification_manager_->RemoveObserver(this);
207 210
208 // TODO(tzik): Destroy |sync_worker_| and |worker_observer_| on the worker. 211 worker_task_runner_->PostTask(
212 FROM_HERE,
213 base::Bind(
214 &SyncWorker::DestructOnWorker,
215 base::Passed(&sync_worker_),
216 base::Passed(worker_observer_.PassAs<SyncWorker::Observer>())));
209 } 217 }
210 218
211 void SyncEngine::Initialize(const base::FilePath& base_dir, 219 void SyncEngine::Initialize(const base::FilePath& base_dir,
212 base::SequencedTaskRunner* file_task_runner, 220 base::SequencedTaskRunner* file_task_runner,
221 const base::Closure& closure,
213 leveldb::Env* env_override) { 222 leveldb::Env* env_override) {
214 // DriveServiceWrapper and DriveServiceOnWorker relay communications 223 // DriveServiceWrapper and DriveServiceOnWorker relay communications
215 // between DriveService and syncers in SyncWorker. 224 // between DriveService and syncers in SyncWorker.
216 scoped_ptr<drive::DriveServiceInterface> 225 scoped_ptr<drive::DriveServiceInterface>
217 drive_service_on_worker( 226 drive_service_on_worker(
218 new DriveServiceOnWorker(drive_service_wrapper_->AsWeakPtr(), 227 new DriveServiceOnWorker(drive_service_wrapper_->AsWeakPtr(),
219 base::MessageLoopProxy::current(), 228 base::MessageLoopProxy::current(),
220 worker_task_runner_)); 229 worker_task_runner_));
221 scoped_ptr<drive::DriveUploaderInterface> 230 scoped_ptr<drive::DriveUploaderInterface>
222 drive_uploader_on_worker( 231 drive_uploader_on_worker(
223 new DriveUploaderOnWorker(drive_uploader_wrapper_->AsWeakPtr(), 232 new DriveUploaderOnWorker(drive_uploader_wrapper_->AsWeakPtr(),
224 base::MessageLoopProxy::current(), 233 base::MessageLoopProxy::current(),
225 worker_task_runner_)); 234 worker_task_runner_));
226 scoped_ptr<SyncEngineContext> 235 scoped_ptr<SyncEngineContext>
227 sync_engine_context( 236 sync_engine_context(
228 new SyncEngineContext(drive_service_on_worker.Pass(), 237 new SyncEngineContext(drive_service_on_worker.Pass(),
229 drive_uploader_on_worker.Pass(), 238 drive_uploader_on_worker.Pass(),
230 base::MessageLoopProxy::current(), 239 base::MessageLoopProxy::current(),
231 worker_task_runner_, 240 worker_task_runner_,
232 file_task_runner)); 241 file_task_runner));
233 242
234 worker_observer_.reset( 243 worker_observer_.reset(
235 new WorkerObserver(base::MessageLoopProxy::current(), 244 new WorkerObserver(base::MessageLoopProxy::current(),
236 weak_ptr_factory_.GetWeakPtr())); 245 weak_ptr_factory_.GetWeakPtr()));
237 246
238 base::WeakPtr<ExtensionServiceInterface> extension_service_weak_ptr; 247 base::WeakPtr<ExtensionServiceInterface> extension_service_weak_ptr;
239 if (extension_service_) 248 if (extension_service_)
240 extension_service_weak_ptr = extension_service_->AsWeakPtr(); 249 extension_service_weak_ptr = extension_service_->AsWeakPtr();
241 250
242 // TODO(peria): Use PostTask on |worker_task_runner_| to call this function.
243 sync_worker_ = SyncWorker::CreateOnWorker(
244 base_dir,
245 worker_observer_.get(),
246 extension_service_weak_ptr,
247 sync_engine_context.Pass(),
248 env_override);
249
250 if (notification_manager_) 251 if (notification_manager_)
251 notification_manager_->AddObserver(this); 252 notification_manager_->AddObserver(this);
252 GetDriveService()->AddObserver(this); 253 GetDriveService()->AddObserver(this);
253 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); 254 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
255
256 PostTaskAndReplyWithResult(
257 worker_task_runner_,
258 FROM_HERE,
259 base::Bind(&SyncWorker::CreateOnWorker,
260 base_dir,
261 worker_observer_.get(),
262 extension_service_weak_ptr,
263 base::Passed(sync_engine_context.Pass()),
264 env_override),
265 base::Bind(&SyncEngine::SetSyncWorker,
266 weak_ptr_factory_.GetWeakPtr(),
267 closure));
254 } 268 }
255 269
256 void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) { 270 void SyncEngine::AddServiceObserver(SyncServiceObserver* observer) {
257 service_observers_.AddObserver(observer); 271 service_observers_.AddObserver(observer);
258 } 272 }
259 273
260 void SyncEngine::AddFileStatusObserver(FileStatusObserver* observer) { 274 void SyncEngine::AddFileStatusObserver(FileStatusObserver* observer) {
261 file_status_observers_.AddObserver(observer); 275 file_status_observers_.AddObserver(observer);
262 } 276 }
263 277
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); 552 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id);
539 bool is_app_root_tracker_enabled = 553 bool is_app_root_tracker_enabled =
540 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; 554 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT;
541 if (is_app_enabled && !is_app_root_tracker_enabled) 555 if (is_app_enabled && !is_app_root_tracker_enabled)
542 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); 556 EnableOrigin(origin, base::Bind(&EmptyStatusCallback));
543 else if (!is_app_enabled && is_app_root_tracker_enabled) 557 else if (!is_app_enabled && is_app_root_tracker_enabled)
544 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); 558 DisableOrigin(origin, base::Bind(&EmptyStatusCallback));
545 } 559 }
546 } 560 }
547 561
562 void SyncEngine::SetSyncWorker(const base::Closure& closure,
563 scoped_ptr<SyncWorker> sync_worker) {
564 sync_worker_ = sync_worker.Pass();
565 closure.Run();
566 }
567
548 } // namespace drive_backend 568 } // namespace drive_backend
549 } // namespace sync_file_system 569 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698