Index: chrome/browser/sync/engine/syncer_thread_pthreads.h |
=================================================================== |
--- chrome/browser/sync/engine/syncer_thread_pthreads.h (revision 27123) |
+++ chrome/browser/sync/engine/syncer_thread_pthreads.h (working copy) |
@@ -1,284 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
-// |
-// *THIS EXISTS FOR EXPERIMENTATION AND TESTING WHILE WE REPLACE PTHREADS |
-// WITH CHROME THREADS IN SYNC CODE* |
- |
-// A class to run the syncer on a thread. Uses PIMPL to wrap the old, original |
-// pthreads implementation of SyncerThread. |
-#ifndef CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_PTHREADS_H_ |
-#define CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_PTHREADS_H_ |
- |
-#include <list> |
-#include <map> |
-#include <queue> |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "base/scoped_ptr.h" |
-#include "chrome/browser/sync/engine/all_status.h" |
-#include "chrome/browser/sync/engine/client_command_channel.h" |
-#include "chrome/browser/sync/util/event_sys-inl.h" |
-#include "chrome/browser/sync/util/pthread_helpers.h" |
-#include "chrome/browser/sync/engine/syncer_thread.h" |
-#include "testing/gtest/include/gtest/gtest_prod.h" // For FRIEND_TEST |
- |
-class EventListenerHookup; |
- |
-namespace syncable { |
-class DirectoryManager; |
-struct DirectoryManagerEvent; |
-} |
- |
-namespace browser_sync { |
- |
-class ModelSafeWorker; |
-class ServerConnectionManager; |
-class Syncer; |
-class TalkMediator; |
-class URLFactory; |
-struct ServerConnectionEvent; |
-struct SyncerEvent; |
-struct SyncerShutdownEvent; |
-struct TalkMediatorEvent; |
- |
-// The legacy implementation of SyncerThread using pthreads, kept around for |
-// historical experimentation until a new version is finalized. |
-class SyncerThreadPthreadImpl { |
- public: |
- virtual ~SyncerThreadPthreadImpl(); |
- |
- virtual void WatchConnectionManager(ServerConnectionManager* conn_mgr); |
- // Creates and starts a syncer thread. |
- // Returns true if it creates a thread or if there's currently a thread |
- // running and false otherwise. |
- virtual bool Start(); |
- |
- // Stop processing. A max wait of at least 2*server RTT time is recommended. |
- // returns true if we stopped, false otherwise. |
- virtual bool Stop(int max_wait); |
- |
- // Nudges the syncer to sync with a delay specified. This API is for access |
- // from the SyncerThread's controller and will cause a mutex lock. |
- virtual bool NudgeSyncer(int milliseconds_from_now, |
- SyncerThread::NudgeSource source); |
- |
- // Registers this thread to watch talk mediator events. |
- virtual void WatchTalkMediator(TalkMediator* talk_mediator); |
- |
- virtual void WatchClientCommands(ClientCommandChannel* channel); |
- |
- virtual SyncerEventChannel* channel(); |
- |
- private: |
- friend class SyncerThreadPthreads; |
- SyncerThreadPthreadImpl(ClientCommandChannel* command_channel, |
- syncable::DirectoryManager* mgr, |
- ServerConnectionManager* connection_manager, AllStatus* all_status, |
- ModelSafeWorker* model_safe_worker); |
- |
- // A few members to gate the rate at which we nudge the syncer. |
- enum { |
- kNudgeRateLimitCount = 6, |
- kNudgeRateLimitTime = 180, |
- }; |
- |
- // A queue of all scheduled nudges. One insertion for every call to |
- // NudgeQueue(). |
- typedef std::pair<timespec, SyncerThread::NudgeSource> NudgeObject; |
- |
- struct IsTimeSpecGreater { |
- inline bool operator() (const NudgeObject& lhs, const NudgeObject& rhs) { |
- return lhs.first.tv_sec == rhs.first.tv_sec ? |
- lhs.first.tv_nsec > rhs.first.tv_nsec : |
- lhs.first.tv_sec > rhs.first.tv_sec; |
- } |
- }; |
- |
- typedef std::priority_queue<NudgeObject, std::vector<NudgeObject>, |
- IsTimeSpecGreater> NudgeQueue; |
- |
- // Threshold multipler for how long before user should be considered idle. |
- static const int kPollBackoffThresholdMultiplier = 10; |
- |
- friend void* RunSyncerThread(void* syncer_thread); |
- void* Run(); |
- void HandleDirectoryManagerEvent( |
- const syncable::DirectoryManagerEvent& event); |
- void HandleSyncerEvent(const SyncerEvent& event); |
- void HandleClientCommand(ClientCommandChannel::EventType event); |
- |
- void HandleServerConnectionEvent(const ServerConnectionEvent& event); |
- |
- void HandleTalkMediatorEvent(const TalkMediatorEvent& event); |
- |
- void* ThreadMain(); |
- void ThreadMainLoop(); |
- |
- void SyncMain(Syncer* syncer); |
- |
- // Calculates the next sync wait time in seconds. last_poll_wait is the time |
- // duration of the previous polling timeout which was used. |
- // user_idle_milliseconds is updated by this method, and is a report of the |
- // full amount of time since the last period of activity for the user. The |
- // continue_sync_cycle parameter is used to determine whether or not we are |
- // calculating a polling wait time that is a continuation of an sync cycle |
- // which terminated while the syncer still had work to do. |
- int CalculatePollingWaitTime( |
- const AllStatus::Status& status, |
- int last_poll_wait, // in s |
- int* user_idle_milliseconds, |
- bool* continue_sync_cycle); |
- // Helper to above function, considers effect of user idle time. |
- int CalculateSyncWaitTime(int last_wait, int user_idle_ms); |
- |
- // Sets the source value of the controlled syncer's updates_source value. |
- // The initial sync boolean is updated if read as a sentinel. The following |
- // two methods work in concert to achieve this goal. |
- void UpdateNudgeSource(const timespec& now, bool* continue_sync_cycle, |
- bool* initial_sync); |
- void SetUpdatesSource(bool nudged, SyncerThread::NudgeSource nudge_source, |
- bool* initial_sync); |
- |
- // For unit tests only. |
- void DisableIdleDetection() { disable_idle_detection_ = true; } |
- |
- // False when we want to stop the thread. |
- bool stop_syncer_thread_; |
- |
- // We use one mutex for all members except the channel. |
- PThreadMutex mutex_; |
- typedef PThreadScopedLock<PThreadMutex> MutexLock; |
- |
- // Handle of the running thread. |
- pthread_t thread_; |
- bool thread_running_; |
- |
- // Gets signaled whenever a thread outside of the syncer thread changes a |
- // member variable. |
- PThreadCondVar changed_; |
- |
- // State of the server connection. |
- bool connected_; |
- |
- // State of the notification framework is tracked by these values. |
- bool p2p_authenticated_; |
- bool p2p_subscribed_; |
- |
- scoped_ptr<EventListenerHookup> client_command_hookup_; |
- scoped_ptr<EventListenerHookup> conn_mgr_hookup_; |
- const AllStatus* allstatus_; |
- |
- Syncer* syncer_; |
- |
- syncable::DirectoryManager* dirman_; |
- ServerConnectionManager* scm_; |
- |
- // Modifiable versions of kDefaultLongPollIntervalSeconds which can be |
- // updated by the server. |
- int syncer_short_poll_interval_seconds_; |
- int syncer_long_poll_interval_seconds_; |
- |
- // The time we wait between polls in seconds. This is used as lower bound on |
- // our wait time. Updated once per loop from the command line flag. |
- int syncer_polling_interval_; |
- |
- // The upper bound on the nominal wait between polls in seconds. Note that |
- // this bounds the "nominal" poll interval, while the the actual interval |
- // also takes previous failures into account. |
- int syncer_max_interval_; |
- |
- scoped_ptr<SyncerEventChannel> syncer_event_channel_; |
- |
- // This causes syncer to start syncing ASAP. If the rate of requests is too |
- // high the request will be silently dropped. mutex_ should be held when |
- // this is called. |
- void NudgeSyncImpl(int milliseconds_from_now, |
- SyncerThread::NudgeSource source); |
- |
- NudgeQueue nudge_queue_; |
- |
- scoped_ptr<EventListenerHookup> talk_mediator_hookup_; |
- ClientCommandChannel* const command_channel_; |
- scoped_ptr<EventListenerHookup> directory_manager_hookup_; |
- scoped_ptr<EventListenerHookup> syncer_events_; |
- |
- // Handles any tasks that will result in model changes (modifications of |
- // syncable::Entries). Pass this to the syncer created and managed by |this|. |
- // Only non-null in syncapi case. |
- scoped_ptr<ModelSafeWorker> model_safe_worker_; |
- |
- // Useful for unit tests |
- bool disable_idle_detection_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SyncerThreadPthreadImpl); |
-}; |
- |
-// A new-version SyncerThread pimpl wrapper for the old legacy implementation. |
-class SyncerThreadPthreads : public SyncerThread { |
- FRIEND_TEST(SyncerThreadTest, CalculateSyncWaitTime); |
- FRIEND_TEST(SyncerThreadTest, CalculatePollingWaitTime); |
- FRIEND_TEST(SyncerThreadWithSyncerTest, Polling); |
- FRIEND_TEST(SyncerThreadWithSyncerTest, Nudge); |
- friend class SyncerThreadWithSyncerTest; |
- friend class SyncerThreadFactory; |
- public: |
- virtual ~SyncerThreadPthreads() {} |
- |
- virtual void WatchConnectionManager(ServerConnectionManager* conn_mgr) { |
- impl_->WatchConnectionManager(conn_mgr); |
- } |
- virtual bool Start() { |
- return impl_->Start(); |
- } |
- virtual bool Stop(int max_wait) { |
- return impl_->Stop(max_wait); |
- } |
- virtual bool NudgeSyncer(int milliseconds_from_now, NudgeSource source) { |
- return impl_->NudgeSyncer(milliseconds_from_now, source); |
- } |
- virtual void WatchTalkMediator(TalkMediator* talk_mediator) { |
- impl_->WatchTalkMediator(talk_mediator); |
- } |
- virtual void WatchClientCommands(ClientCommandChannel* channel) { |
- impl_->WatchClientCommands(channel); |
- } |
- virtual SyncerEventChannel* channel() { |
- return impl_->channel(); |
- } |
- protected: |
- SyncerThreadPthreads(ClientCommandChannel* command_channel, |
- syncable::DirectoryManager* mgr, |
- ServerConnectionManager* connection_manager, AllStatus* all_status, |
- ModelSafeWorker* model_safe_worker); |
- virtual void SetConnected(bool connected) { |
- impl_->connected_ = connected; |
- } |
- virtual void SetSyncerPollingInterval(int interval) { |
- impl_->syncer_polling_interval_ = interval; |
- } |
- virtual void SetSyncerShortPollInterval(base::TimeDelta interval) { |
- impl_->syncer_short_poll_interval_seconds_ = static_cast<int>( |
- interval.InSeconds()); |
- } |
- virtual void DisableIdleDetection() { impl_->disable_idle_detection_ = true; } |
- virtual int CalculateSyncWaitTime(int last_wait, int user_idle_ms) { |
- return impl_->CalculateSyncWaitTime(last_wait, user_idle_ms); |
- } |
- virtual int CalculatePollingWaitTime( |
- const AllStatus::Status& status, |
- int last_poll_wait, // in s |
- int* user_idle_milliseconds, |
- bool* continue_sync_cycle) { |
- return impl_->CalculatePollingWaitTime(status, last_poll_wait, |
- user_idle_milliseconds, continue_sync_cycle); |
- } |
- private: |
- scoped_ptr<SyncerThreadPthreadImpl> impl_; |
- DISALLOW_COPY_AND_ASSIGN(SyncerThreadPthreads); |
-}; |
- |
-} // namespace browser_sync |
- |
-#endif // CHROME_BROWSER_SYNC_ENGINE_SYNCER_THREAD_PTHREADS_H_ |