| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 #include "chrome/browser/sync/engine/syncer_thread.h" | 4 #include "chrome/browser/sync/engine/syncer_thread.h" |
| 5 | 5 |
| 6 #include "build/build_config.h" | 6 #include "build/build_config.h" |
| 7 | 7 |
| 8 #if defined(OS_MACOSX) | 8 #if defined(OS_MACOSX) |
| 9 #include <CoreFoundation/CFNumber.h> | 9 #include <CoreFoundation/CFNumber.h> |
| 10 #include <IOKit/IOTypes.h> | 10 #include <IOKit/IOTypes.h> |
| 11 #include <IOKit/IOKitLib.h> | 11 #include <IOKit/IOKitLib.h> |
| 12 #endif | 12 #endif |
| 13 | 13 |
| 14 #include <algorithm> | 14 #include <algorithm> |
| 15 #include <map> | 15 #include <map> |
| 16 #include <queue> | 16 #include <queue> |
| 17 | 17 |
| 18 #include "base/rand_util.h" | 18 #include "base/rand_util.h" |
| 19 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" | 19 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" |
| 20 #include "chrome/browser/sync/engine/auth_watcher.h" | |
| 21 #include "chrome/browser/sync/engine/model_safe_worker.h" | 20 #include "chrome/browser/sync/engine/model_safe_worker.h" |
| 22 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 21 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
| 23 #include "chrome/browser/sync/engine/syncer.h" | 22 #include "chrome/browser/sync/engine/syncer.h" |
| 24 #include "chrome/browser/sync/sessions/session_state.h" | 23 #include "chrome/browser/sync/sessions/session_state.h" |
| 25 #include "chrome/browser/sync/syncable/directory_manager.h" | |
| 26 #include "chrome/common/chrome_switches.h" | 24 #include "chrome/common/chrome_switches.h" |
| 27 #include "jingle/notifier/listener/notification_constants.h" | 25 #include "jingle/notifier/listener/notification_constants.h" |
| 28 | 26 |
| 29 using std::priority_queue; | 27 using std::priority_queue; |
| 30 using std::min; | 28 using std::min; |
| 31 using base::Time; | 29 using base::Time; |
| 32 using base::TimeDelta; | 30 using base::TimeDelta; |
| 33 using base::TimeTicks; | 31 using base::TimeTicks; |
| 34 | 32 |
| 35 namespace browser_sync { | 33 namespace browser_sync { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 : thread_main_started_(false, false), | 66 : thread_main_started_(false, false), |
| 69 thread_("SyncEngine_SyncerThread"), | 67 thread_("SyncEngine_SyncerThread"), |
| 70 vault_field_changed_(&lock_), | 68 vault_field_changed_(&lock_), |
| 71 p2p_authenticated_(false), | 69 p2p_authenticated_(false), |
| 72 p2p_subscribed_(false), | 70 p2p_subscribed_(false), |
| 73 conn_mgr_hookup_(NULL), | 71 conn_mgr_hookup_(NULL), |
| 74 syncer_short_poll_interval_seconds_(kDefaultShortPollIntervalSeconds), | 72 syncer_short_poll_interval_seconds_(kDefaultShortPollIntervalSeconds), |
| 75 syncer_long_poll_interval_seconds_(kDefaultLongPollIntervalSeconds), | 73 syncer_long_poll_interval_seconds_(kDefaultLongPollIntervalSeconds), |
| 76 syncer_polling_interval_(kDefaultShortPollIntervalSeconds), | 74 syncer_polling_interval_(kDefaultShortPollIntervalSeconds), |
| 77 syncer_max_interval_(kDefaultMaxPollIntervalMs), | 75 syncer_max_interval_(kDefaultMaxPollIntervalMs), |
| 78 directory_manager_hookup_(NULL), | |
| 79 syncer_events_(NULL), | 76 syncer_events_(NULL), |
| 80 session_context_(context), | 77 session_context_(context), |
| 81 disable_idle_detection_(false) { | 78 disable_idle_detection_(false) { |
| 82 DCHECK(context); | 79 DCHECK(context); |
| 83 syncer_event_relay_channel_.reset(new SyncerEventChannel()); | 80 syncer_event_relay_channel_.reset(new SyncerEventChannel()); |
| 84 | 81 |
| 85 if (context->directory_manager()) { | |
| 86 directory_manager_hookup_.reset(NewEventListenerHookup( | |
| 87 context->directory_manager()->channel(), this, | |
| 88 &SyncerThread::HandleDirectoryManagerEvent)); | |
| 89 } | |
| 90 | |
| 91 if (context->connection_manager()) | 82 if (context->connection_manager()) |
| 92 WatchConnectionManager(context->connection_manager()); | 83 WatchConnectionManager(context->connection_manager()); |
| 93 | 84 |
| 94 } | 85 } |
| 95 | 86 |
| 96 SyncerThread::~SyncerThread() { | 87 SyncerThread::~SyncerThread() { |
| 97 conn_mgr_hookup_.reset(); | 88 conn_mgr_hookup_.reset(); |
| 98 syncer_event_relay_channel_->Notify(SyncerEvent( | 89 syncer_event_relay_channel_->Notify(SyncerEvent( |
| 99 SyncerEvent::SHUTDOWN_USE_WITH_CARE)); | 90 SyncerEvent::SHUTDOWN_USE_WITH_CARE)); |
| 100 syncer_event_relay_channel_.reset(); | 91 syncer_event_relay_channel_.reset(); |
| 101 directory_manager_hookup_.reset(); | |
| 102 syncer_events_.reset(); | 92 syncer_events_.reset(); |
| 103 delete vault_.syncer_; | 93 delete vault_.syncer_; |
| 104 CHECK(!thread_.IsRunning()); | 94 CHECK(!thread_.IsRunning()); |
| 105 } | 95 } |
| 106 | 96 |
| 107 // Creates and starts a syncer thread. | 97 // Creates and starts a syncer thread. |
| 108 // Returns true if it creates a thread or if there's currently a thread running | 98 // Returns true if it creates a thread or if there's currently a thread running |
| 109 // and false otherwise. | 99 // and false otherwise. |
| 110 bool SyncerThread::Start() { | 100 bool SyncerThread::Start() { |
| 111 { | 101 { |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 | 570 |
| 581 void SyncerThread::HandleChannelEvent(const SyncerEvent& event) { | 571 void SyncerThread::HandleChannelEvent(const SyncerEvent& event) { |
| 582 AutoLock lock(lock_); | 572 AutoLock lock(lock_); |
| 583 relay_channel()->Notify(event); | 573 relay_channel()->Notify(event); |
| 584 if (SyncerEvent::REQUEST_SYNC_NUDGE != event.what_happened) { | 574 if (SyncerEvent::REQUEST_SYNC_NUDGE != event.what_happened) { |
| 585 return; | 575 return; |
| 586 } | 576 } |
| 587 NudgeSyncImpl(event.nudge_delay_milliseconds, kUnknown); | 577 NudgeSyncImpl(event.nudge_delay_milliseconds, kUnknown); |
| 588 } | 578 } |
| 589 | 579 |
| 590 void SyncerThread::HandleDirectoryManagerEvent( | 580 void SyncerThread::CreateSyncer(const std::string& dirname) { |
| 591 const syncable::DirectoryManagerEvent& event) { | 581 AutoLock lock(lock_); |
| 592 LOG(INFO) << "Handling a directory manager event"; | 582 LOG(INFO) << "Creating syncer up for: " << dirname; |
| 593 if (syncable::DirectoryManagerEvent::OPENED == event.what_happened) { | 583 // The underlying database structure is ready, and we should create |
| 594 AutoLock lock(lock_); | 584 // the syncer. |
| 595 LOG(INFO) << "Syncer starting up for: " << event.dirname; | 585 CHECK(vault_.syncer_ == NULL); |
| 596 // The underlying database structure is ready, and we should create | 586 session_context_->set_account_name(dirname); |
| 597 // the syncer. | 587 vault_.syncer_ = new Syncer(session_context_.get()); |
| 598 CHECK(vault_.syncer_ == NULL); | |
| 599 session_context_->set_account_name(event.dirname); | |
| 600 vault_.syncer_ = new Syncer(session_context_.get()); | |
| 601 | 588 |
| 602 syncer_events_.reset( | 589 syncer_events_.reset( |
| 603 session_context_->syncer_event_channel()->AddObserver(this)); | 590 session_context_->syncer_event_channel()->AddObserver(this)); |
| 604 vault_field_changed_.Broadcast(); | 591 vault_field_changed_.Broadcast(); |
| 605 } | |
| 606 } | 592 } |
| 607 | 593 |
| 608 // Sets |*connected| to false if it is currently true but |code| suggests that | 594 // Sets |*connected| to false if it is currently true but |code| suggests that |
| 609 // the current network configuration and/or auth state cannot be used to make | 595 // the current network configuration and/or auth state cannot be used to make |
| 610 // forward progress, and user intervention (e.g changing server URL or auth | 596 // forward progress, and user intervention (e.g changing server URL or auth |
| 611 // credentials) is likely necessary. If |*connected| is false, set it to true | 597 // credentials) is likely necessary. If |*connected| is false, set it to true |
| 612 // if |code| suggests that we just recently made healthy contact with the | 598 // if |code| suggests that we just recently made healthy contact with the |
| 613 // server. | 599 // server. |
| 614 static inline void CheckConnected(bool* connected, | 600 static inline void CheckConnected(bool* connected, |
| 615 HttpResponse::ServerConnectionCode code, | 601 HttpResponse::ServerConnectionCode code, |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 was_logged = true; | 778 was_logged = true; |
| 793 LOG(INFO) << "UserIdleTime unimplemented on this platform, " | 779 LOG(INFO) << "UserIdleTime unimplemented on this platform, " |
| 794 "synchronization will not throttle when user idle"; | 780 "synchronization will not throttle when user idle"; |
| 795 } | 781 } |
| 796 #endif | 782 #endif |
| 797 | 783 |
| 798 return 0; | 784 return 0; |
| 799 } | 785 } |
| 800 | 786 |
| 801 } // namespace browser_sync | 787 } // namespace browser_sync |
| OLD | NEW |