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

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

Issue 11341030: sync: reland scheduler ownership refactoring, now with less crash (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update Created 8 years, 1 month 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 | « sync/engine/sync_scheduler_impl.h ('k') | sync/engine/sync_scheduler_unittest.cc » ('j') | 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 "sync/engine/sync_scheduler_impl.h" 5 #include "sync/engine/sync_scheduler_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 DCHECK_EQ(MessageLoop::current(), sync_loop_); 1014 DCHECK_EQ(MessageLoop::current(), sync_loop_);
1015 SDVLOG(2) << "Do canary job"; 1015 SDVLOG(2) << "Do canary job";
1016 1016
1017 // Only set canary privileges here, when we are about to run the job. This 1017 // Only set canary privileges here, when we are about to run the job. This
1018 // avoids confusion in managing canary bits during scheduling, when you 1018 // avoids confusion in managing canary bits during scheduling, when you
1019 // consider that mode switches (e.g., to config) can "pre-empt" a NUDGE that 1019 // consider that mode switches (e.g., to config) can "pre-empt" a NUDGE that
1020 // was scheduled as canary, and send it to an "unscheduled" state. 1020 // was scheduled as canary, and send it to an "unscheduled" state.
1021 to_be_canary->GrantCanaryPrivilege(); 1021 to_be_canary->GrantCanaryPrivilege();
1022 1022
1023 if (to_be_canary->purpose() == SyncSessionJob::NUDGE) { 1023 if (to_be_canary->purpose() == SyncSessionJob::NUDGE) {
1024 DCHECK_EQ(pending_nudge_->session(), to_be_canary->session());
1024 // TODO(tim): We should be able to remove this... 1025 // TODO(tim): We should be able to remove this...
1025 scoped_ptr<SyncSession> temp = CreateSyncSession( 1026 scoped_ptr<SyncSession> temp = CreateSyncSession(
1026 to_be_canary->session()->source()).Pass(); 1027 to_be_canary->session()->source()).Pass();
1027 // The routing info might have been changed since we cached the 1028 // The routing info might have been changed since we cached the
1028 // pending nudge. Update it by coalescing to the latest. 1029 // pending nudge. Update it by coalescing to the latest.
1029 to_be_canary->mutable_session()->Coalesce(*(temp)); 1030 to_be_canary->mutable_session()->Coalesce(*(temp));
1030 } 1031 }
1031 DoSyncSessionJob(to_be_canary.Pass()); 1032 DoSyncSessionJob(to_be_canary.Pass());
1032 } 1033 }
1033 1034
1034 scoped_ptr<SyncSessionJob> SyncSchedulerImpl::TakePendingJobForCurrentMode() { 1035 scoped_ptr<SyncSessionJob> SyncSchedulerImpl::TakePendingJobForCurrentMode() {
1035 DCHECK_EQ(MessageLoop::current(), sync_loop_); 1036 DCHECK_EQ(MessageLoop::current(), sync_loop_);
1036 // If we find a scheduled pending_ job, abandon the old one and return a 1037 // If we find a scheduled pending_ job, abandon the old one and return a
1037 // a clone. If unscheduled, just hand over ownership. 1038 // a clone. If unscheduled, just hand over ownership.
1038 scoped_ptr<SyncSessionJob> candidate; 1039 scoped_ptr<SyncSessionJob> candidate;
1039 if (mode_ == CONFIGURATION_MODE && wait_interval_.get() 1040 if (mode_ == CONFIGURATION_MODE && wait_interval_.get()
1040 && wait_interval_->pending_configure_job) { 1041 && wait_interval_->pending_configure_job) {
1041 SDVLOG(2) << "Found pending configure job"; 1042 SDVLOG(2) << "Found pending configure job";
1042 candidate = 1043 candidate =
1043 wait_interval_->pending_configure_job->CloneAndAbandon().Pass(); 1044 wait_interval_->pending_configure_job->CloneAndAbandon().Pass();
1044 wait_interval_->pending_configure_job = candidate.get(); 1045 wait_interval_->pending_configure_job = candidate.get();
1045 } else if (mode_ == NORMAL_MODE && pending_nudge_) { 1046 } else if (mode_ == NORMAL_MODE && pending_nudge_) {
1046 SDVLOG(2) << "Found pending nudge job"; 1047 SDVLOG(2) << "Found pending nudge job";
1047 candidate = pending_nudge_->CloneAndAbandon(); 1048 candidate = pending_nudge_->CloneAndAbandon();
1048 pending_nudge_ = candidate.get(); 1049 pending_nudge_ = candidate.get();
1049 unscheduled_nudge_storage_.reset(); 1050 unscheduled_nudge_storage_.reset();
1050 } 1051 }
1052 // If we took a job and there's a wait interval, we took the pending canary.
1053 if (candidate && wait_interval_)
1054 wait_interval_->timer.Stop();
rlarocque 2012/10/30 17:50:20 What if the timer fires somewhere between this lin
tim (not reviewing) 2012/10/30 17:58:29 Everything happens on the same message loop, so if
1051 return candidate.Pass(); 1055 return candidate.Pass();
1052 } 1056 }
1053 1057
1054 scoped_ptr<SyncSession> SyncSchedulerImpl::CreateSyncSession( 1058 scoped_ptr<SyncSession> SyncSchedulerImpl::CreateSyncSession(
1055 const SyncSourceInfo& source) { 1059 const SyncSourceInfo& source) {
1056 DCHECK_EQ(MessageLoop::current(), sync_loop_); 1060 DCHECK_EQ(MessageLoop::current(), sync_loop_);
1057 DVLOG(2) << "Creating sync session with routes " 1061 DVLOG(2) << "Creating sync session with routes "
1058 << ModelSafeRoutingInfoToString(session_context_->routing_info()); 1062 << ModelSafeRoutingInfoToString(session_context_->routing_info());
1059 1063
1060 SyncSourceInfo info(source); 1064 SyncSourceInfo info(source);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 1178
1175 #undef SDVLOG_LOC 1179 #undef SDVLOG_LOC
1176 1180
1177 #undef SDVLOG 1181 #undef SDVLOG
1178 1182
1179 #undef SLOG 1183 #undef SLOG
1180 1184
1181 #undef ENUM_CASE 1185 #undef ENUM_CASE
1182 1186
1183 } // namespace syncer 1187 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/engine/sync_scheduler_impl.h ('k') | sync/engine/sync_scheduler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698