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

Side by Side Diff: chrome/browser/sync/glue/sync_backend_host.cc

Issue 10808040: [Sync] Avoid ObserverListThreadSafe in ChromeSyncNotificationBridge (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 8 years, 5 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
« no previous file with comments | « chrome/browser/sync/glue/sync_backend_host.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #include "chrome/browser/sync/glue/sync_backend_host.h" 7 #include "chrome/browser/sync/glue/sync_backend_host.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/compiler_specific.h" 14 #include "base/compiler_specific.h"
15 #include "base/file_path.h" 15 #include "base/file_path.h"
16 #include "base/file_util.h" 16 #include "base/file_util.h"
17 #include "base/location.h" 17 #include "base/location.h"
18 #include "base/metrics/histogram.h" 18 #include "base/metrics/histogram.h"
19 #include "base/threading/sequenced_worker_pool.h" 19 #include "base/threading/sequenced_worker_pool.h"
20 #include "base/threading/thread_restrictions.h" 20 #include "base/threading/thread_restrictions.h"
21 #include "base/timer.h" 21 #include "base/timer.h"
22 #include "base/tracked_objects.h" 22 #include "base/tracked_objects.h"
23 #include "base/utf_string_conversions.h" 23 #include "base/utf_string_conversions.h"
24 #include "chrome/browser/profiles/profile.h" 24 #include "chrome/browser/profiles/profile.h"
25 #include "chrome/browser/signin/token_service.h" 25 #include "chrome/browser/signin/token_service.h"
26 #include "chrome/browser/sync/glue/bridged_sync_notifier.h" 26 #include "chrome/browser/sync/glue/bridged_sync_notifier.h"
27 #include "chrome/browser/sync/glue/change_processor.h" 27 #include "chrome/browser/sync/glue/change_processor.h"
28 #include "chrome/browser/sync/glue/chrome_encryptor.h" 28 #include "chrome/browser/sync/glue/chrome_encryptor.h"
29 #include "chrome/browser/sync/glue/chrome_sync_notification_bridge.h"
29 #include "chrome/browser/sync/glue/sync_backend_registrar.h" 30 #include "chrome/browser/sync/glue/sync_backend_registrar.h"
30 #include "chrome/browser/sync/invalidations/invalidator_storage.h" 31 #include "chrome/browser/sync/invalidations/invalidator_storage.h"
31 #include "chrome/browser/sync/sync_prefs.h" 32 #include "chrome/browser/sync/sync_prefs.h"
32 #include "chrome/common/chrome_notification_types.h" 33 #include "chrome/common/chrome_notification_types.h"
33 #include "chrome/common/chrome_switches.h" 34 #include "chrome/common/chrome_switches.h"
34 #include "chrome/common/chrome_version_info.h" 35 #include "chrome/common/chrome_version_info.h"
35 #include "chrome/common/net/gaia/gaia_constants.h" 36 #include "chrome/common/net/gaia/gaia_constants.h"
36 #include "content/public/browser/browser_thread.h" 37 #include "content/public/browser/browser_thread.h"
37 #include "content/public/browser/notification_service.h" 38 #include "content/public/browser/notification_service.h"
38 #include "content/public/common/content_client.h" 39 #include "content/public/common/content_client.h"
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 const base::WeakPtr<InvalidatorStorage>& invalidator_storage) 286 const base::WeakPtr<InvalidatorStorage>& invalidator_storage)
286 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 287 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
287 sync_thread_("Chrome_SyncThread"), 288 sync_thread_("Chrome_SyncThread"),
288 frontend_loop_(MessageLoop::current()), 289 frontend_loop_(MessageLoop::current()),
289 profile_(profile), 290 profile_(profile),
290 name_(name), 291 name_(name),
291 core_(new Core(name, profile_->GetPath().Append(kSyncDataFolderName), 292 core_(new Core(name, profile_->GetPath().Append(kSyncDataFolderName),
292 weak_ptr_factory_.GetWeakPtr())), 293 weak_ptr_factory_.GetWeakPtr())),
293 initialization_state_(NOT_ATTEMPTED), 294 initialization_state_(NOT_ATTEMPTED),
294 sync_prefs_(sync_prefs), 295 sync_prefs_(sync_prefs),
295 chrome_sync_notification_bridge_(profile_),
296 sync_notifier_factory_( 296 sync_notifier_factory_(
297 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), 297 ParseNotifierOptions(*CommandLine::ForCurrentProcess(),
298 profile_->GetRequestContext()), 298 profile_->GetRequestContext()),
299 content::GetUserAgent(GURL()), 299 content::GetUserAgent(GURL()),
300 invalidator_storage), 300 invalidator_storage),
301 frontend_(NULL) { 301 frontend_(NULL) {
302 } 302 }
303 303
304 SyncBackendHost::SyncBackendHost(Profile* profile) 304 SyncBackendHost::SyncBackendHost(Profile* profile)
305 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 305 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
306 sync_thread_("Chrome_SyncThread"), 306 sync_thread_("Chrome_SyncThread"),
307 frontend_loop_(MessageLoop::current()), 307 frontend_loop_(MessageLoop::current()),
308 profile_(profile), 308 profile_(profile),
309 name_("Unknown"), 309 name_("Unknown"),
310 initialization_state_(NOT_ATTEMPTED), 310 initialization_state_(NOT_ATTEMPTED),
311 chrome_sync_notification_bridge_(profile_),
312 sync_notifier_factory_( 311 sync_notifier_factory_(
313 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), 312 ParseNotifierOptions(*CommandLine::ForCurrentProcess(),
314 profile_->GetRequestContext()), 313 profile_->GetRequestContext()),
315 content::GetUserAgent(GURL()), 314 content::GetUserAgent(GURL()),
316 base::WeakPtr<syncer::InvalidationStateTracker>()), 315 base::WeakPtr<syncer::InvalidationStateTracker>()),
317 frontend_(NULL) { 316 frontend_(NULL) {
318 } 317 }
319 318
320 SyncBackendHost::~SyncBackendHost() { 319 SyncBackendHost::~SyncBackendHost() {
321 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; 320 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor.";
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 syncer::ModelTypeSet initial_types, 370 syncer::ModelTypeSet initial_types,
372 const SyncCredentials& credentials, 371 const SyncCredentials& credentials,
373 bool delete_sync_data_folder, 372 bool delete_sync_data_folder,
374 syncer::SyncManagerFactory* sync_manager_factory, 373 syncer::SyncManagerFactory* sync_manager_factory,
375 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler, 374 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler,
376 syncer::ReportUnrecoverableErrorFunction 375 syncer::ReportUnrecoverableErrorFunction
377 report_unrecoverable_error_function) { 376 report_unrecoverable_error_function) {
378 if (!sync_thread_.Start()) 377 if (!sync_thread_.Start())
379 return; 378 return;
380 379
380 chrome_sync_notification_bridge_.reset(
381 new ChromeSyncNotificationBridge(
382 profile_, sync_thread_.message_loop_proxy()));
383
381 frontend_ = frontend; 384 frontend_ = frontend;
382 DCHECK(frontend); 385 DCHECK(frontend);
383 386
384 syncer::ModelTypeSet initial_types_with_nigori(initial_types); 387 syncer::ModelTypeSet initial_types_with_nigori(initial_types);
385 CHECK(sync_prefs_.get()); 388 CHECK(sync_prefs_.get());
386 if (sync_prefs_->HasSyncSetupCompleted()) { 389 if (sync_prefs_->HasSyncSetupCompleted()) {
387 initial_types_with_nigori.Put(syncer::NIGORI); 390 initial_types_with_nigori.Put(syncer::NIGORI);
388 } 391 }
389 392
390 registrar_.reset(new SyncBackendRegistrar(initial_types_with_nigori, 393 registrar_.reset(new SyncBackendRegistrar(initial_types_with_nigori,
(...skipping 10 matching lines...) Expand all
401 sync_thread_.message_loop(), 404 sync_thread_.message_loop(),
402 registrar_.get(), 405 registrar_.get(),
403 routing_info, 406 routing_info,
404 workers, 407 workers,
405 &extensions_activity_monitor_, 408 &extensions_activity_monitor_,
406 event_handler, 409 event_handler,
407 sync_service_url, 410 sync_service_url,
408 base::Bind(&MakeHttpBridgeFactory, 411 base::Bind(&MakeHttpBridgeFactory,
409 make_scoped_refptr(profile_->GetRequestContext())), 412 make_scoped_refptr(profile_->GetRequestContext())),
410 credentials, 413 credentials,
411 &chrome_sync_notification_bridge_, 414 chrome_sync_notification_bridge_.get(),
412 &sync_notifier_factory_, 415 &sync_notifier_factory_,
413 sync_manager_factory, 416 sync_manager_factory,
414 delete_sync_data_folder, 417 delete_sync_data_folder,
415 sync_prefs_->GetEncryptionBootstrapToken(), 418 sync_prefs_->GetEncryptionBootstrapToken(),
416 new InternalComponentsFactoryImpl(), 419 new InternalComponentsFactoryImpl(),
417 unrecoverable_error_handler, 420 unrecoverable_error_handler,
418 report_unrecoverable_error_function)); 421 report_unrecoverable_error_function));
419 } 422 }
420 423
421 void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) { 424 void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) {
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 base::ThreadRestrictions::ScopedAllowIO allow_io; 581 base::ThreadRestrictions::ScopedAllowIO allow_io;
579 sync_thread_.Stop(); 582 sync_thread_.Stop();
580 } 583 }
581 base::TimeDelta stop_sync_thread_time = base::Time::Now() - 584 base::TimeDelta stop_sync_thread_time = base::Time::Now() -
582 stop_thread_start_time; 585 stop_thread_start_time;
583 UMA_HISTOGRAM_TIMES("Sync.Shutdown.StopSyncThreadTime", 586 UMA_HISTOGRAM_TIMES("Sync.Shutdown.StopSyncThreadTime",
584 stop_sync_thread_time); 587 stop_sync_thread_time);
585 588
586 registrar_.reset(); 589 registrar_.reset();
587 frontend_ = NULL; 590 frontend_ = NULL;
591 chrome_sync_notification_bridge_.reset();
588 core_ = NULL; // Releases reference to core_. 592 core_ = NULL; // Releases reference to core_.
589 } 593 }
590 594
591 void SyncBackendHost::ConfigureDataTypes( 595 void SyncBackendHost::ConfigureDataTypes(
592 syncer::ConfigureReason reason, 596 syncer::ConfigureReason reason,
593 syncer::ModelTypeSet types_to_add, 597 syncer::ModelTypeSet types_to_add,
594 syncer::ModelTypeSet types_to_remove, 598 syncer::ModelTypeSet types_to_remove,
595 NigoriState nigori_state, 599 NigoriState nigori_state,
596 const base::Callback<void(syncer::ModelTypeSet)>& ready_task, 600 const base::Callback<void(syncer::ModelTypeSet)>& ready_task,
597 const base::Callback<void()>& retry_callback) { 601 const base::Callback<void()>& retry_callback) {
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 SDVLOG(1) 753 SDVLOG(1)
750 << "Added types: " 754 << "Added types: "
751 << syncer::ModelTypeSetToString(types_to_configure) 755 << syncer::ModelTypeSetToString(types_to_configure)
752 << ", configured types: " 756 << ", configured types: "
753 << syncer::ModelTypeSetToString(configured_types) 757 << syncer::ModelTypeSetToString(configured_types)
754 << ", failed configuration types: " 758 << ", failed configuration types: "
755 << syncer::ModelTypeSetToString(failed_configuration_types); 759 << syncer::ModelTypeSetToString(failed_configuration_types);
756 760
757 // Update |chrome_sync_notification_bridge_|'s enabled types here as it has 761 // Update |chrome_sync_notification_bridge_|'s enabled types here as it has
758 // to happen on the UI thread. 762 // to happen on the UI thread.
759 chrome_sync_notification_bridge_.UpdateEnabledTypes(configured_types); 763 chrome_sync_notification_bridge_->UpdateEnabledTypes(configured_types);
760 764
761 // Notify SyncManager (especially the notification listener) about new types. 765 // Notify SyncManager (especially the notification listener) about new types.
762 sync_thread_.message_loop()->PostTask(FROM_HERE, 766 sync_thread_.message_loop()->PostTask(FROM_HERE,
763 base::Bind(&SyncBackendHost::Core::DoUpdateEnabledTypes, core_.get(), 767 base::Bind(&SyncBackendHost::Core::DoUpdateEnabledTypes, core_.get(),
764 configured_types)); 768 configured_types));
765 769
766 if (!ready_task.is_null()) 770 if (!ready_task.is_null())
767 ready_task.Run(failed_configuration_types); 771 ready_task.Run(failed_configuration_types);
768 } 772 }
769 773
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 FROM_HERE, 1375 FROM_HERE,
1372 base::Bind(&SyncBackendHost::Core::DoRefreshNigori, 1376 base::Bind(&SyncBackendHost::Core::DoRefreshNigori,
1373 core_.get(), sync_thread_done_callback)); 1377 core_.get(), sync_thread_done_callback));
1374 } 1378 }
1375 1379
1376 #undef SDVLOG 1380 #undef SDVLOG
1377 1381
1378 #undef SLOG 1382 #undef SLOG
1379 1383
1380 } // namespace browser_sync 1384 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/sync_backend_host.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698