Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // A class to run the syncer on a thread. | 5 // A class to run the syncer on a thread. |
| 6 // This is the default implementation of SyncerThread whose Stop implementation | 6 // This is the default implementation of SyncerThread whose Stop implementation |
| 7 // does not support a timeout, but is greatly simplified. | 7 // does not support a timeout, but is greatly simplified. |
| 8 #ifndef CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_H_ | 8 #ifndef CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_H_ |
| 9 #define CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_H_ | 9 #define CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_H_ |
| 10 #pragma once | 10 #pragma once |
| 11 | 11 |
| 12 #include <list> | 12 #include <list> |
| 13 #include <map> | |
|
akalin
2011/01/21 19:50:09
No need for this since you're using the typedef fr
Nicolas Zea
2011/01/21 21:57:44
Done.
| |
| 13 #include <string> | 14 #include <string> |
| 14 #include <vector> | 15 #include <vector> |
| 15 | 16 |
| 16 #include "base/basictypes.h" | 17 #include "base/basictypes.h" |
| 17 #include "base/gtest_prod_util.h" | 18 #include "base/gtest_prod_util.h" |
| 18 #include "base/ref_counted.h" | 19 #include "base/ref_counted.h" |
| 19 #include "base/scoped_ptr.h" | 20 #include "base/scoped_ptr.h" |
| 20 #include "base/synchronization/condition_variable.h" | 21 #include "base/synchronization/condition_variable.h" |
| 21 #include "base/threading/thread.h" | 22 #include "base/threading/thread.h" |
| 22 #include "base/time.h" | 23 #include "base/time.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 42 | 43 |
| 43 class SyncerThread : public base::RefCountedThreadSafe<SyncerThread>, | 44 class SyncerThread : public base::RefCountedThreadSafe<SyncerThread>, |
| 44 public sessions::SyncSession::Delegate { | 45 public sessions::SyncSession::Delegate { |
| 45 FRIEND_TEST_ALL_PREFIXES(SyncerThreadTest, CalculateSyncWaitTime); | 46 FRIEND_TEST_ALL_PREFIXES(SyncerThreadTest, CalculateSyncWaitTime); |
| 46 FRIEND_TEST_ALL_PREFIXES(SyncerThreadTest, CalculatePollingWaitTime); | 47 FRIEND_TEST_ALL_PREFIXES(SyncerThreadTest, CalculatePollingWaitTime); |
| 47 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Polling); | 48 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Polling); |
| 48 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Nudge); | 49 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Nudge); |
| 49 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, NudgeWithDataTypes); | 50 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, NudgeWithDataTypes); |
| 50 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, | 51 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, |
| 51 NudgeWithDataTypesCoalesced); | 52 NudgeWithDataTypesCoalesced); |
| 53 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, NudgeWithPayloads); | |
| 54 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, | |
| 55 NudgeWithPayloadsCoalesced); | |
| 52 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Throttling); | 56 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Throttling); |
| 53 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, AuthInvalid); | 57 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, AuthInvalid); |
| 54 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Pause); | 58 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, Pause); |
| 55 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, StartWhenNotConnected); | 59 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, StartWhenNotConnected); |
| 56 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, PauseWhenNotConnected); | 60 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, PauseWhenNotConnected); |
| 57 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, StopSyncPermanently); | 61 FRIEND_TEST_ALL_PREFIXES(SyncerThreadWithSyncerTest, StopSyncPermanently); |
| 58 friend class SyncerThreadWithSyncerTest; | 62 friend class SyncerThreadWithSyncerTest; |
| 59 friend class SyncerThreadFactory; | 63 friend class SyncerThreadFactory; |
| 60 public: | 64 public: |
| 61 // Encapsulates the parameters that make up an interval on which the | 65 // Encapsulates the parameters that make up an interval on which the |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 | 135 |
| 132 // Nudges the syncer to sync with a delay specified. This API is for access | 136 // Nudges the syncer to sync with a delay specified. This API is for access |
| 133 // from the SyncerThread's controller and will cause a mutex lock. | 137 // from the SyncerThread's controller and will cause a mutex lock. |
| 134 virtual void NudgeSyncer(int milliseconds_from_now, NudgeSource source); | 138 virtual void NudgeSyncer(int milliseconds_from_now, NudgeSource source); |
| 135 | 139 |
| 136 // Same as |NudgeSyncer|, but supports tracking the datatypes that caused | 140 // Same as |NudgeSyncer|, but supports tracking the datatypes that caused |
| 137 // the nudge to occur. | 141 // the nudge to occur. |
| 138 virtual void NudgeSyncerWithDataTypes( | 142 virtual void NudgeSyncerWithDataTypes( |
| 139 int milliseconds_from_now, | 143 int milliseconds_from_now, |
| 140 NudgeSource source, | 144 NudgeSource source, |
| 141 const syncable::ModelTypeBitSet& model_type); | 145 const syncable::ModelTypeBitSet& model_types); |
| 146 | |
| 147 // Same as |NudgeSyncer|, but supports including a payload for passing on to | |
| 148 // the download updates command. Datatypes with payloads are also considered | |
| 149 // to have caused a nudged to occur and treated accordingly. | |
| 150 virtual void NudgeSyncerWithPayloads( | |
| 151 int milliseconds_from_now, | |
| 152 NudgeSource source, | |
| 153 const sessions::SyncSourceInfo::ModelTypeMap& model_types_with_payloads); | |
| 142 | 154 |
| 143 void SetNotificationsEnabled(bool notifications_enabled); | 155 void SetNotificationsEnabled(bool notifications_enabled); |
| 144 | 156 |
| 145 // Call this when a directory is opened | 157 // Call this when a directory is opened |
| 146 void CreateSyncer(const std::string& dirname); | 158 void CreateSyncer(const std::string& dirname); |
| 147 | 159 |
| 148 // DDOS avoidance function. The argument and return value is in seconds | 160 // DDOS avoidance function. The argument and return value is in seconds |
| 149 static int GetRecommendedDelaySeconds(int base_delay_seconds); | 161 static int GetRecommendedDelaySeconds(int base_delay_seconds); |
| 150 | 162 |
| 151 protected: | 163 protected: |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 182 Syncer* syncer_; | 194 Syncer* syncer_; |
| 183 | 195 |
| 184 // State of the server connection. | 196 // State of the server connection. |
| 185 bool connected_; | 197 bool connected_; |
| 186 | 198 |
| 187 // kUnknown if there is no pending nudge. (Theoretically, there | 199 // kUnknown if there is no pending nudge. (Theoretically, there |
| 188 // could be a pending nudge of type kUnknown, so it's better to | 200 // could be a pending nudge of type kUnknown, so it's better to |
| 189 // check pending_nudge_time_.) | 201 // check pending_nudge_time_.) |
| 190 NudgeSource pending_nudge_source_; | 202 NudgeSource pending_nudge_source_; |
| 191 | 203 |
| 192 // BitSet of the datatypes that have triggered the current nudge | 204 // Map of all datatypes that are requesting a nudge. Can be union |
| 193 // (can be union of various bitsets when multiple nudges are coalesced) | 205 // from multiple nudges that are coalesced. In addition, we |
| 194 syncable::ModelTypeBitSet pending_nudge_types_; | 206 // optionally track a payload associated with each datatype (most recent |
| 207 // payload overwrites old ones). These payloads are used by the download | |
| 208 // updates command and can contain datatype specific information the server | |
| 209 // might use. | |
| 210 sessions::SyncSourceInfo::ModelTypeMap pending_nudge_types_; | |
| 195 | 211 |
| 196 // null iff there is no pending nudge. | 212 // null iff there is no pending nudge. |
| 197 base::TimeTicks pending_nudge_time_; | 213 base::TimeTicks pending_nudge_time_; |
| 198 | 214 |
| 199 // The wait interval for to the current iteration of our main loop. This is | 215 // The wait interval for to the current iteration of our main loop. This is |
| 200 // only written to by the syncer thread, and since the only reader from a | 216 // only written to by the syncer thread, and since the only reader from a |
| 201 // different thread (NudgeSync) is called at totally random times, we don't | 217 // different thread (NudgeSync) is called at totally random times, we don't |
| 202 // really need to access mutually exclusively as the data races that exist | 218 // really need to access mutually exclusively as the data races that exist |
| 203 // are intrinsic, but do so anyway and avoid using 'volatile'. | 219 // are intrinsic, but do so anyway and avoid using 'volatile'. |
| 204 WaitInterval current_wait_interval_; | 220 WaitInterval current_wait_interval_; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 273 // Builds a SyncSourceInfo and returns whether a nudge occurred in the | 289 // Builds a SyncSourceInfo and returns whether a nudge occurred in the |
| 274 // |was_nudged| parameter. | 290 // |was_nudged| parameter. |
| 275 sessions::SyncSourceInfo GetAndResetNudgeSource(bool was_throttled, | 291 sessions::SyncSourceInfo GetAndResetNudgeSource(bool was_throttled, |
| 276 bool continue_sync_cycle, | 292 bool continue_sync_cycle, |
| 277 bool* initial_sync, | 293 bool* initial_sync, |
| 278 bool* was_nudged); | 294 bool* was_nudged); |
| 279 | 295 |
| 280 sessions::SyncSourceInfo MakeSyncSourceInfo( | 296 sessions::SyncSourceInfo MakeSyncSourceInfo( |
| 281 bool nudged, | 297 bool nudged, |
| 282 NudgeSource nudge_source, | 298 NudgeSource nudge_source, |
| 283 const syncable::ModelTypeBitSet& nudge_types, | 299 const sessions::SyncSourceInfo::ModelTypeMap& nudge_types, |
|
akalin
2011/01/21 19:50:09
rename to model_types_with_payloads to be consiste
Nicolas Zea
2011/01/21 21:57:44
Done.
| |
| 284 bool* initial_sync); | 300 bool* initial_sync); |
| 285 | 301 |
| 286 int UserIdleTime(); | 302 int UserIdleTime(); |
| 287 | 303 |
| 288 void WaitUntilConnectedOrQuit(); | 304 void WaitUntilConnectedOrQuit(); |
| 289 | 305 |
| 290 // The thread will remain in this method until a resume is requested | 306 // The thread will remain in this method until a resume is requested |
| 291 // or shutdown is started. | 307 // or shutdown is started. |
| 292 void PauseUntilResumedOrQuit(); | 308 void PauseUntilResumedOrQuit(); |
| 293 | 309 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 320 // this bounds the "nominal" poll interval, while the the actual interval | 336 // this bounds the "nominal" poll interval, while the the actual interval |
| 321 // also takes previous failures into account. | 337 // also takes previous failures into account. |
| 322 int syncer_max_interval_; | 338 int syncer_max_interval_; |
| 323 | 339 |
| 324 // This causes syncer to start syncing ASAP. If the rate of requests is too | 340 // This causes syncer to start syncing ASAP. If the rate of requests is too |
| 325 // high the request will be silently dropped. mutex_ should be held when | 341 // high the request will be silently dropped. mutex_ should be held when |
| 326 // this is called. | 342 // this is called. |
| 327 void NudgeSyncImpl( | 343 void NudgeSyncImpl( |
| 328 int milliseconds_from_now, | 344 int milliseconds_from_now, |
| 329 NudgeSource source, | 345 NudgeSource source, |
| 330 const syncable::ModelTypeBitSet& model_types); | 346 const sessions::SyncSourceInfo::ModelTypeMap& model_types_with_payloads); |
| 331 | 347 |
| 332 #if defined(OS_LINUX) | 348 #if defined(OS_LINUX) |
| 333 // On Linux, we need this information in order to query idle time. | 349 // On Linux, we need this information in order to query idle time. |
| 334 scoped_ptr<IdleQueryLinux> idle_query_; | 350 scoped_ptr<IdleQueryLinux> idle_query_; |
| 335 #endif | 351 #endif |
| 336 | 352 |
| 337 scoped_ptr<sessions::SyncSessionContext> session_context_; | 353 scoped_ptr<sessions::SyncSessionContext> session_context_; |
| 338 | 354 |
| 339 // Set whenever the server instructs us to stop sending it requests until | 355 // Set whenever the server instructs us to stop sending it requests until |
| 340 // a specified time, and reset for each call to SyncShare. (Note that the | 356 // a specified time, and reset for each call to SyncShare. (Note that the |
| 341 // WaitInterval::THROTTLED contract is such that we don't call SyncShare at | 357 // WaitInterval::THROTTLED contract is such that we don't call SyncShare at |
| 342 // all until the "silenced until" embargo expires.) | 358 // all until the "silenced until" embargo expires.) |
| 343 base::TimeTicks silenced_until_; | 359 base::TimeTicks silenced_until_; |
| 344 | 360 |
| 345 // Useful for unit tests | 361 // Useful for unit tests |
| 346 bool disable_idle_detection_; | 362 bool disable_idle_detection_; |
| 347 | 363 |
| 348 DISALLOW_COPY_AND_ASSIGN(SyncerThread); | 364 DISALLOW_COPY_AND_ASSIGN(SyncerThread); |
| 349 }; | 365 }; |
| 350 | 366 |
| 351 } // namespace browser_sync | 367 } // namespace browser_sync |
| 352 | 368 |
| 353 #endif // CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_H_ | 369 #endif // CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_H_ |
| OLD | NEW |