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

Side by Side Diff: sync/engine/sync_scheduler_impl.h

Issue 13422003: sync: Refactor job ownership in SyncScheduler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed upload Created 7 years, 8 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 | « no previous file | sync/engine/sync_scheduler_impl.cc » ('j') | sync/engine/sync_session_job.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 #ifndef SYNC_ENGINE_SYNC_SCHEDULER_IMPL_H_ 5 #ifndef SYNC_ENGINE_SYNC_SCHEDULER_IMPL_H_
6 #define SYNC_ENGINE_SYNC_SCHEDULER_IMPL_H_ 6 #define SYNC_ENGINE_SYNC_SCHEDULER_IMPL_H_
7 7
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 10
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/cancelable_callback.h" 12 #include "base/cancelable_callback.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/gtest_prod_util.h" 14 #include "base/gtest_prod_util.h"
15 #include "base/memory/linked_ptr.h" 15 #include "base/memory/linked_ptr.h"
16 #include "base/memory/scoped_ptr.h" 16 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/weak_ptr.h" 17 #include "base/memory/weak_ptr.h"
18 #include "base/observer_list.h" 18 #include "base/threading/non_thread_safe.h"
19 #include "base/time.h" 19 #include "base/time.h"
20 #include "base/timer.h" 20 #include "base/timer.h"
21 #include "sync/base/sync_export.h" 21 #include "sync/base/sync_export.h"
22 #include "sync/engine/net/server_connection_manager.h" 22 #include "sync/engine/net/server_connection_manager.h"
23 #include "sync/engine/nudge_source.h" 23 #include "sync/engine/nudge_source.h"
24 #include "sync/engine/sync_scheduler.h" 24 #include "sync/engine/sync_scheduler.h"
25 #include "sync/engine/sync_session_job.h" 25 #include "sync/engine/sync_session_job.h"
26 #include "sync/engine/syncer.h" 26 #include "sync/engine/syncer.h"
27 #include "sync/internal_api/public/base/model_type_invalidation_map.h" 27 #include "sync/internal_api/public/base/model_type_invalidation_map.h"
28 #include "sync/internal_api/public/engine/polling_constants.h" 28 #include "sync/internal_api/public/engine/polling_constants.h"
29 #include "sync/internal_api/public/util/weak_handle.h" 29 #include "sync/internal_api/public/util/weak_handle.h"
30 #include "sync/sessions/sync_session.h" 30 #include "sync/sessions/sync_session.h"
31 #include "sync/sessions/sync_session_context.h" 31 #include "sync/sessions/sync_session_context.h"
32 32
33 namespace syncer { 33 namespace syncer {
34 34
35 class BackoffDelayProvider; 35 class BackoffDelayProvider;
36 36
37 class SYNC_EXPORT_PRIVATE SyncSchedulerImpl : public SyncScheduler { 37 class SYNC_EXPORT_PRIVATE SyncSchedulerImpl
38 : public SyncScheduler,
39 public base::NonThreadSafe {
38 public: 40 public:
39 // |name| is a display string to identify the syncer thread. Takes 41 // |name| is a display string to identify the syncer thread. Takes
40 // |ownership of |syncer| and |delay_provider|. 42 // |ownership of |syncer| and |delay_provider|.
41 SyncSchedulerImpl(const std::string& name, 43 SyncSchedulerImpl(const std::string& name,
42 BackoffDelayProvider* delay_provider, 44 BackoffDelayProvider* delay_provider,
43 sessions::SyncSessionContext* context, 45 sessions::SyncSessionContext* context,
44 Syncer* syncer); 46 Syncer* syncer);
45 47
46 // Calls Stop(). 48 // Calls Stop().
47 virtual ~SyncSchedulerImpl(); 49 virtual ~SyncSchedulerImpl();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 friend class SyncSchedulerTest; 102 friend class SyncSchedulerTest;
101 friend class SyncSchedulerWhiteboxTest; 103 friend class SyncSchedulerWhiteboxTest;
102 friend class SyncerTest; 104 friend class SyncerTest;
103 105
104 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, 106 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
105 DropNudgeWhileExponentialBackOff); 107 DropNudgeWhileExponentialBackOff);
106 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, SaveNudge); 108 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, SaveNudge);
107 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, 109 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
108 SaveNudgeWhileTypeThrottled); 110 SaveNudgeWhileTypeThrottled);
109 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinueNudge); 111 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinueNudge);
110 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, DropPoll);
111 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinuePoll);
112 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinueConfiguration); 112 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, ContinueConfiguration);
113 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, 113 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
114 SaveConfigurationWhileThrottled); 114 SaveConfigurationWhileThrottled);
115 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, 115 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
116 SaveNudgeWhileThrottled); 116 SaveNudgeWhileThrottled);
117 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest, 117 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
118 ContinueCanaryJobConfig); 118 ContinueCanaryJobConfig);
119 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerWhiteboxTest,
120 ContinueNudgeWhileExponentialBackOff);
121 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, TransientPollFailure); 119 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, TransientPollFailure);
122 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, GetInitialBackoffDelay);
123 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, 120 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest,
124 ServerConnectionChangeDuringBackoff); 121 ServerConnectionChangeDuringBackoff);
125 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest, 122 FRIEND_TEST_ALL_PREFIXES(SyncSchedulerTest,
126 ConnectionChangeCanaryPreemptedByNudge); 123 ConnectionChangeCanaryPreemptedByNudge);
127 124
128 struct SYNC_EXPORT_PRIVATE WaitInterval { 125 struct SYNC_EXPORT_PRIVATE WaitInterval {
129 enum Mode { 126 enum Mode {
130 // Uninitialized state, should not be set in practice. 127 // Uninitialized state, should not be set in practice.
131 UNKNOWN = -1, 128 UNKNOWN = -1,
132 // A wait interval whose duration has been affected by exponential 129 // We enter a series of increasingly longer WaitIntervals if we experience
133 // backoff. 130 // repeated transient failures. We retry at the end of each interval.
134 // EXPONENTIAL_BACKOFF intervals are nudge-rate limited to 1 per interval.
135 EXPONENTIAL_BACKOFF, 131 EXPONENTIAL_BACKOFF,
136 // A server-initiated throttled interval. We do not allow any syncing 132 // A server-initiated throttled interval. We do not allow any syncing
137 // during such an interval. 133 // during such an interval.
138 THROTTLED, 134 THROTTLED,
139 }; 135 };
140 WaitInterval(); 136 WaitInterval();
141 ~WaitInterval(); 137 ~WaitInterval();
142 WaitInterval(Mode mode, base::TimeDelta length); 138 WaitInterval(Mode mode, base::TimeDelta length);
143 139
144 static const char* GetModeString(Mode mode); 140 static const char* GetModeString(Mode mode);
145 141
146 Mode mode; 142 Mode mode;
147
148 // This bool is set to true if we have observed a nudge during this
149 // interval and mode == EXPONENTIAL_BACKOFF.
150 bool had_nudge;
151 base::TimeDelta length; 143 base::TimeDelta length;
152 base::OneShotTimer<SyncSchedulerImpl> timer;
153
154 // Configure jobs are saved only when backing off or throttling. So we
155 // expose the pointer here (does not own, similar to pending_nudge).
156 SyncSessionJob* pending_configure_job;
157 }; 144 };
158 145
159 static const char* GetModeString(Mode mode); 146 static const char* GetModeString(Mode mode);
160 147
161 static const char* GetDecisionString(JobProcessDecision decision); 148 static const char* GetDecisionString(JobProcessDecision decision);
162 149
163 // Helper to cancel any existing delayed task and replace it with a new one. 150 // Invoke the syncer to perform a non-POLL job.
164 // It will not post any tasks if the scheduler is in a "stopped" state. 151 bool DoSyncSessionJobImpl(scoped_ptr<SyncSessionJob> job,
165 void PostDelayedTask(const tracked_objects::Location& from_here, 152 JobPriority priority);
166 const char* name,
167 const base::Closure& task,
168 base::TimeDelta delay);
169 153
170 // Invoke the Syncer to perform a non-poll job. 154 // Invoke the syncer to perform a nudge job.
171 bool DoSyncSessionJob(scoped_ptr<SyncSessionJob> job, 155 void DoNudgeSyncSessionJob(JobPriority priority);
172 JobPriority priority); 156
157 // Invoke the syncer to perform a configuration job.
158 bool DoConfigurationSyncSessionJob(JobPriority priority);
173 159
174 // Returns whether or not it's safe to run a poll job at this time. 160 // Returns whether or not it's safe to run a poll job at this time.
175 bool ShouldPoll(); 161 bool ShouldPoll();
176 162
177 // Invoke the Syncer to perform a poll job. 163 // Invoke the Syncer to perform a poll job.
178 void DoPollSyncSessionJob(scoped_ptr<SyncSessionJob> job); 164 void DoPollSyncSessionJob();
179 165
180 // Called after the Syncer has performed the sync represented by |job|, to 166 // Called after the Syncer has performed the sync represented by |job|, to
181 // reset our state. |exited_prematurely| is true if the Syncer did not 167 // reset our state. |exited_prematurely| is true if the Syncer did not
182 // cycle from job.start_step() to job.end_step(), likely because the 168 // cycle from job.start_step() to job.end_step(), likely because the
183 // scheduler was forced to quit the job mid-way through. 169 // scheduler was forced to quit the job mid-way through.
184 bool FinishSyncSessionJob(SyncSessionJob* job, 170 bool FinishSyncSessionJob(SyncSessionJob* job,
185 bool exited_prematurely, 171 bool exited_prematurely,
186 sessions::SyncSession* session); 172 sessions::SyncSession* session);
187 173
188 // Helper to schedule retries of a failed configure or nudge job. 174 // Helper to schedule retries of a failed configure or nudge job.
189 void ScheduleNextSync(scoped_ptr<SyncSessionJob> finished_job, 175 void ScheduleNextSync(scoped_ptr<SyncSessionJob> finished_job,
190 sessions::SyncSession* session); 176 sessions::SyncSession* session);
191 177
192 // Helper to configure polling intervals. Used by Start and ScheduleNextSync. 178 // Helper to configure polling intervals. Used by Start and ScheduleNextSync.
193 void AdjustPolling(const SyncSessionJob* old_job); 179 void AdjustPolling(const SyncSessionJob* old_job);
194 180
195 // Helper to restart waiting with |wait_interval_|'s timer. 181 // Helper to restart waiting with |wait_interval_|'s timer.
196 void RestartWaiting(scoped_ptr<SyncSessionJob> job); 182 void RestartWaiting();
197 183
198 // Helper to ScheduleNextSync in case of consecutive sync errors. 184 // Helper to ScheduleNextSync in case of consecutive sync errors.
199 void HandleContinuationError(scoped_ptr<SyncSessionJob> old_job, 185 void HandleContinuationError(scoped_ptr<SyncSessionJob> old_job,
200 sessions::SyncSession* session); 186 sessions::SyncSession* session);
201 187
202 // Decide whether we should CONTINUE, SAVE or DROP the job. 188 // Decide whether we should CONTINUE, SAVE or DROP the job.
203 JobProcessDecision DecideOnJob(const SyncSessionJob& job, 189 JobProcessDecision DecideOnJob(const SyncSessionJob& job,
204 JobPriority priority); 190 JobPriority priority);
205 191
206 // If DecideOnJob decides that |job| should be SAVEd, this function will
207 // carry out the task of actually "saving" (or coalescing) the job.
208 void HandleSaveJobDecision(scoped_ptr<SyncSessionJob> job);
209
210 // Decide on whether to CONTINUE, SAVE or DROP the job when we are in 192 // Decide on whether to CONTINUE, SAVE or DROP the job when we are in
211 // backoff mode. 193 // backoff mode.
212 JobProcessDecision DecideWhileInWaitInterval(const SyncSessionJob& job, 194 JobProcessDecision DecideWhileInWaitInterval(const SyncSessionJob& job,
213 JobPriority priority); 195 JobPriority priority);
214 196
215 // 'Impl' here refers to real implementation of public functions, running on 197 // 'Impl' here refers to real implementation of public functions, running on
216 // |thread_|. 198 // |thread_|.
217 void StopImpl(const base::Closure& callback); 199 void StopImpl(const base::Closure& callback);
218 200
219 // If the scheduler's current state supports it, this will create a job based 201 // If the scheduler's current state supports it, this will create a job based
220 // on the passed in parameters and coalesce it with any other pending jobs, 202 // on the passed in parameters and coalesce it with any other pending jobs,
221 // then post a delayed task to run it. It may also choose to drop the job or 203 // then post a delayed task to run it. It may also choose to drop the job or
222 // save it for later, depending on the scheduler's current state. 204 // save it for later, depending on the scheduler's current state.
223 void ScheduleNudgeImpl( 205 void ScheduleNudgeImpl(
224 const base::TimeDelta& delay, 206 const base::TimeDelta& delay,
225 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source, 207 sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source,
226 const ModelTypeInvalidationMap& invalidation_map, 208 const ModelTypeInvalidationMap& invalidation_map,
227 const tracked_objects::Location& nudge_location); 209 const tracked_objects::Location& nudge_location);
228 210
229 // Returns true if the client is currently in exponential backoff. 211 // Returns true if the client is currently in exponential backoff.
230 bool IsBackingOff() const; 212 bool IsBackingOff() const;
231 213
232 // Helper to signal all listeners registered with |session_context_|. 214 // Helper to signal all listeners registered with |session_context_|.
233 void Notify(SyncEngineEvent::EventCause cause); 215 void Notify(SyncEngineEvent::EventCause cause);
234 216
235 // Helper to signal listeners about changed retry time 217 // Helper to signal listeners about changed retry time
236 void NotifyRetryTime(base::Time retry_time); 218 void NotifyRetryTime(base::Time retry_time);
237 219
238 // Callback to change backoff state. |to_be_canary| in both cases is the job 220 // Looks for pending work and, if it finds any, run this work at "canary"
239 // that should be granted canary privileges. Note: it is possible that the 221 // priority.
240 // job that gets scheduled when this callback is scheduled is different from 222 void TryCanaryJob();
241 // the job that will actually get executed, because other jobs may have been
242 // scheduled while we were waiting for the callback.
243 void DoCanaryJob(scoped_ptr<SyncSessionJob> to_be_canary);
244 void Unthrottle(scoped_ptr<SyncSessionJob> to_be_canary);
245 223
246 // Returns a pending job that has potential to run given the state of the 224 // Transitions out of the THROTTLED WaitInterval then calls TryCanaryJob().
247 // scheduler, if it exists. Useful whenever an event occurs that may 225 void Unthrottle();
248 // change conditions that permit a job to run, such as re-establishing
249 // network connection, auth refresh, mode changes etc. Note that the returned
250 // job may have been scheduled to run at a later time, or may have been
251 // unscheduled. In the former case, this will result in abandoning the old
252 // job and effectively cancelling it.
253 scoped_ptr<SyncSessionJob> TakePendingJobForCurrentMode();
254 226
255 // Called when the root cause of the current connection error is fixed. 227 // Called when the root cause of the current connection error is fixed.
256 void OnServerConnectionErrorFixed(); 228 void OnServerConnectionErrorFixed();
257 229
258 // Creates a session for a poll and performs the sync. 230 // Creates a session for a poll and performs the sync.
259 void PollTimerCallback(); 231 void PollTimerCallback();
260 232
261 // Called once the first time thread_ is started to broadcast an initial 233 // Called once the first time thread_ is started to broadcast an initial
262 // session snapshot containing data like initial_sync_ended. Important when 234 // session snapshot containing data like initial_sync_ended. Important when
263 // the client starts up and does not need to perform an initial sync. 235 // the client starts up and does not need to perform an initial sync.
(...skipping 12 matching lines...) Expand all
276 // A second factory specially for weak_handle_this_, to allow the handle 248 // A second factory specially for weak_handle_this_, to allow the handle
277 // to be const and alleviate threading concerns. 249 // to be const and alleviate threading concerns.
278 base::WeakPtrFactory<SyncSchedulerImpl> weak_ptr_factory_for_weak_handle_; 250 base::WeakPtrFactory<SyncSchedulerImpl> weak_ptr_factory_for_weak_handle_;
279 251
280 // For certain methods that need to worry about X-thread posting. 252 // For certain methods that need to worry about X-thread posting.
281 const WeakHandle<SyncSchedulerImpl> weak_handle_this_; 253 const WeakHandle<SyncSchedulerImpl> weak_handle_this_;
282 254
283 // Used for logging. 255 // Used for logging.
284 const std::string name_; 256 const std::string name_;
285 257
286 // The message loop this object is on. Almost all methods have to
287 // be called on this thread.
288 base::MessageLoop* const sync_loop_;
289
290 // Set in Start(), unset in Stop(). 258 // Set in Start(), unset in Stop().
291 bool started_; 259 bool started_;
292 260
293 // Modifiable versions of kDefaultLongPollIntervalSeconds which can be 261 // Modifiable versions of kDefaultLongPollIntervalSeconds which can be
294 // updated by the server. 262 // updated by the server.
295 base::TimeDelta syncer_short_poll_interval_seconds_; 263 base::TimeDelta syncer_short_poll_interval_seconds_;
296 base::TimeDelta syncer_long_poll_interval_seconds_; 264 base::TimeDelta syncer_long_poll_interval_seconds_;
297 265
298 // Server-tweakable sessions commit delay. 266 // Server-tweakable sessions commit delay.
299 base::TimeDelta sessions_commit_delay_; 267 base::TimeDelta sessions_commit_delay_;
300 268
301 // Periodic timer for polling. See AdjustPolling. 269 // Periodic timer for polling. See AdjustPolling.
302 base::RepeatingTimer<SyncSchedulerImpl> poll_timer_; 270 base::RepeatingTimer<SyncSchedulerImpl> poll_timer_;
303 271
304 // The mode of operation. 272 // The mode of operation.
305 Mode mode_; 273 Mode mode_;
306 274
307 // Tracks (does not own) in-flight nudges (scheduled or unscheduled),
308 // so we can coalesce. NULL if there is no pending nudge.
309 SyncSessionJob* pending_nudge_;
310
311 // There are certain situations where we want to remember a nudge, but
312 // there is no well defined moment in time in the future when that nudge
313 // should run, e.g. if it requires a mode switch or updated auth credentials.
314 // This member will own NUDGE jobs in those cases, until an external event
315 // (mode switch or fixed auth) occurs to trigger a retry. Should be treated
316 // as opaque / not interacted with (i.e. we could build a wrapper to
317 // hide the type, but that's probably overkill).
318 scoped_ptr<SyncSessionJob> unscheduled_nudge_storage_;
319
320 // Current wait state. Null if we're not in backoff and not throttled. 275 // Current wait state. Null if we're not in backoff and not throttled.
321 scoped_ptr<WaitInterval> wait_interval_; 276 scoped_ptr<WaitInterval> wait_interval_;
322 277
323 scoped_ptr<BackoffDelayProvider> delay_provider_; 278 scoped_ptr<BackoffDelayProvider> delay_provider_;
324 279
325 // We allow at most one PostedTask to be pending at one time. This is it. 280 // The event that will wake us up.
326 // We will cancel this task before starting a new one. 281 base::OneShotTimer<SyncSchedulerImpl> pending_wakeup_timer_;
327 base::CancelableClosure pending_wakeup_; 282
283 // Pending configure job storage. Note that
284 // (mode_ != CONFIGURATION_MODE) \implies !pending_configure_job_.
285 scoped_ptr<SyncSessionJob> pending_configure_job_;
286
287 // Pending nudge job storage. These jobs can exist in CONFIGURATION_MODE, but
288 // they will be run only in NORMAL_MODE.
289 scoped_ptr<SyncSessionJob> pending_nudge_job_;
328 290
329 // Invoked to run through the sync cycle. 291 // Invoked to run through the sync cycle.
330 scoped_ptr<Syncer> syncer_; 292 scoped_ptr<Syncer> syncer_;
331 293
332 sessions::SyncSessionContext* session_context_; 294 sessions::SyncSessionContext* session_context_;
333 295
334 // A map tracking LOCAL NudgeSource invocations of ScheduleNudge* APIs, 296 // A map tracking LOCAL NudgeSource invocations of ScheduleNudge* APIs,
335 // organized by datatype. Each datatype that was part of the types requested 297 // organized by datatype. Each datatype that was part of the types requested
336 // in the call will have its TimeTicks value updated. 298 // in the call will have its TimeTicks value updated.
337 typedef std::map<ModelType, base::TimeTicks> ModelTypeTimeMap; 299 typedef std::map<ModelType, base::TimeTicks> ModelTypeTimeMap;
338 ModelTypeTimeMap last_local_nudges_by_model_type_; 300 ModelTypeTimeMap last_local_nudges_by_model_type_;
339 301
340 // Used as an "anti-reentrancy defensive assertion". 302 // Used as an "anti-reentrancy defensive assertion".
341 // While true, it is illegal for any new scheduling activity to take place. 303 // While true, it is illegal for any new scheduling activity to take place.
342 // Ensures that higher layers don't break this law in response to events that 304 // Ensures that higher layers don't break this law in response to events that
343 // take place during a sync cycle. We call this out because such violations 305 // take place during a sync cycle. We call this out because such violations
344 // could result in tight sync loops hitting sync servers. 306 // could result in tight sync loops hitting sync servers.
345 bool no_scheduling_allowed_; 307 bool no_scheduling_allowed_;
346 308
347 DISALLOW_COPY_AND_ASSIGN(SyncSchedulerImpl); 309 DISALLOW_COPY_AND_ASSIGN(SyncSchedulerImpl);
348 }; 310 };
349 311
350 } // namespace syncer 312 } // namespace syncer
351 313
352 #endif // SYNC_ENGINE_SYNC_SCHEDULER_IMPL_H_ 314 #endif // SYNC_ENGINE_SYNC_SCHEDULER_IMPL_H_
OLDNEW
« no previous file with comments | « no previous file | sync/engine/sync_scheduler_impl.cc » ('j') | sync/engine/sync_session_job.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698