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

Side by Side Diff: chrome/browser/sync/glue/model_association_manager.cc

Issue 10694168: Revert 146422 - Merge 144583 - sync: fix reentrancy crash in ModelAssociationManager (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1180/src/
Patch Set: Created 8 years, 5 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
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 <algorithm> 5 #include <algorithm>
6 #include <functional> 6 #include <functional>
7 7
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 // Build a ModelType -> order map for sorting. 94 // Build a ModelType -> order map for sorting.
95 for (int i = 0; i < static_cast<int>(arraysize(kStartOrder)); i++) 95 for (int i = 0; i < static_cast<int>(arraysize(kStartOrder)); i++)
96 start_order_[kStartOrder[i]] = i; 96 start_order_[kStartOrder[i]] = i;
97 } 97 }
98 98
99 ModelAssociationManager::~ModelAssociationManager() { 99 ModelAssociationManager::~ModelAssociationManager() {
100 } 100 }
101 101
102 void ModelAssociationManager::Initialize( 102 void ModelAssociationManager::Initialize(
103 syncable::ModelTypeSet desired_types) { 103 syncable::ModelTypeSet desired_types) {
104 // TODO(tim): Bug 134550. CHECKing to ensure no reentrancy on dev channel. 104 DCHECK_EQ(state_, IDLE);
105 // Remove this.
106 CHECK_EQ(state_, IDLE);
107 needs_start_.clear(); 105 needs_start_.clear();
108 needs_stop_.clear(); 106 needs_stop_.clear();
109 failed_datatypes_info_.clear(); 107 failed_datatypes_info_.clear();
110 desired_types_ = desired_types; 108 desired_types_ = desired_types;
111 state_ = INITIALIZED_TO_CONFIGURE; 109 state_ = INITIAILIZED_TO_CONFIGURE;
112 110
113 DVLOG(1) << "ModelAssociationManager: Initializing"; 111 DVLOG(1) << "ModelAssociationManager: Initializing";
114 112
115 // Stop the types that are still loading from the previous configuration. 113 // Stop the types that are still loading from the previous configuration.
116 // If they are enabled we will start them here once again. 114 // If they are enabled we will start them here once again.
117 for (std::vector<DataTypeController*>::const_iterator it = 115 for (std::vector<DataTypeController*>::const_iterator it =
118 pending_model_load_.begin(); 116 pending_model_load_.begin();
119 it != pending_model_load_.end(); 117 it != pending_model_load_.end();
120 ++it) { 118 ++it) {
121 DVLOG(1) << "ModelAssociationManager: Stopping " 119 DVLOG(1) << "ModelAssociationManager: Stopping "
(...skipping 27 matching lines...) Expand all
149 DVLOG(1) << "ModelTypeToString: Will stop " << dtc->name(); 147 DVLOG(1) << "ModelTypeToString: Will stop " << dtc->name();
150 } 148 }
151 } 149 }
152 // Sort these according to kStartOrder. 150 // Sort these according to kStartOrder.
153 std::sort(needs_stop_.begin(), 151 std::sort(needs_stop_.begin(),
154 needs_stop_.end(), 152 needs_stop_.end(),
155 SortComparator(&start_order_)); 153 SortComparator(&start_order_));
156 } 154 }
157 155
158 void ModelAssociationManager::StartAssociationAsync() { 156 void ModelAssociationManager::StartAssociationAsync() {
159 DCHECK_EQ(state_, INITIALIZED_TO_CONFIGURE); 157 DCHECK_EQ(state_, INITIAILIZED_TO_CONFIGURE);
160 state_ = CONFIGURING; 158 state_ = CONFIGURING;
161 DVLOG(1) << "ModelAssociationManager: Going to start model association"; 159 DVLOG(1) << "ModelAssociationManager: Going to start model association";
162 LoadModelForNextType(); 160 LoadModelForNextType();
163 } 161 }
164 162
165 void ModelAssociationManager::ResetForReconfiguration() { 163 void ModelAssociationManager::ResetForReconfiguration() {
166 DCHECK_EQ(state_, INITIALIZED_TO_CONFIGURE); 164 DCHECK_EQ(state_, INITIAILIZED_TO_CONFIGURE);
167 state_ = IDLE; 165 state_ = IDLE;
168 DVLOG(1) << "ModelAssociationManager: Reseting for reconfiguration"; 166 DVLOG(1) << "ModelAssociationManager: Reseting for reconfiguration";
169 needs_start_.clear(); 167 needs_start_.clear();
170 needs_stop_.clear(); 168 needs_stop_.clear();
171 failed_datatypes_info_.clear(); 169 failed_datatypes_info_.clear();
172 } 170 }
173 171
174 void ModelAssociationManager::StopDisabledTypes() { 172 void ModelAssociationManager::StopDisabledTypes() {
175 DCHECK_EQ(state_, INITIALIZED_TO_CONFIGURE); 173 DCHECK_EQ(state_, INITIAILIZED_TO_CONFIGURE);
176 DVLOG(1) << "ModelAssociationManager: Stopping disabled types."; 174 DVLOG(1) << "ModelAssociationManager: Stopping disabled types.";
177 // Stop requested data types. 175 // Stop requested data types.
178 for (size_t i = 0; i < needs_stop_.size(); ++i) { 176 for (size_t i = 0; i < needs_stop_.size(); ++i) {
179 DVLOG(1) << "ModelAssociationManager: Stopping " << needs_stop_[i]->name(); 177 DVLOG(1) << "ModelAssociationManager: Stopping " << needs_stop_[i]->name();
180 needs_stop_[i]->Stop(); 178 needs_stop_[i]->Stop();
181 } 179 }
182 needs_stop_.clear(); 180 needs_stop_.clear();
183 } 181 }
184 182
185 void ModelAssociationManager::Stop() { 183 void ModelAssociationManager::Stop() {
(...skipping 20 matching lines...) Expand all
206 204
207 DCHECK_EQ(IDLE, state_); 205 DCHECK_EQ(IDLE, state_);
208 206
209 // We are in the midle of model association. We need to inform the caller 207 // We are in the midle of model association. We need to inform the caller
210 // so the caller can send notificationst to PSS layer. 208 // so the caller can send notificationst to PSS layer.
211 need_to_call_model_association_done = true; 209 need_to_call_model_association_done = true;
212 } 210 }
213 211
214 // Now continue stopping any types that have already started. 212 // Now continue stopping any types that have already started.
215 DCHECK(state_ == IDLE || 213 DCHECK(state_ == IDLE ||
216 state_ == INITIALIZED_TO_CONFIGURE); 214 state_ == INITIAILIZED_TO_CONFIGURE);
217 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin(); 215 for (DataTypeController::TypeMap::const_iterator it = controllers_->begin();
218 it != controllers_->end(); ++it) { 216 it != controllers_->end(); ++it) {
219 DataTypeController* dtc = (*it).second; 217 DataTypeController* dtc = (*it).second;
220 if (dtc->state() != DataTypeController::NOT_RUNNING && 218 if (dtc->state() != DataTypeController::NOT_RUNNING &&
221 dtc->state() != DataTypeController::STOPPING) { 219 dtc->state() != DataTypeController::STOPPING) {
222 dtc->Stop(); 220 dtc->Stop();
223 DVLOG(1) << "ModelAssociationManager: Stopped " << dtc->name(); 221 DVLOG(1) << "ModelAssociationManager: Stopped " << dtc->name();
224 } 222 }
225 } 223 }
226 224
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 // Treat it like a regular error. 409 // Treat it like a regular error.
412 AppendToFailedDatatypesAndLogError( 410 AppendToFailedDatatypesAndLogError(
413 DataTypeController::ASSOCIATION_FAILED, 411 DataTypeController::ASSOCIATION_FAILED,
414 error); 412 error);
415 } 413 }
416 return; 414 return;
417 } 415 }
418 } 416 }
419 NOTREACHED(); 417 NOTREACHED();
420 return; 418 return;
421 } else if (state_ == IDLE) { 419 } else {
422 DVLOG(1) << "ModelAssociationManager: Models loaded after configure cycle" 420 DVLOG(1) << "ModelAssociationManager: Models loaded after configure cycle"
423 << "Informing DTM"; 421 << "Informing DTM";
424 // This datatype finished loading after the deadline imposed by the 422 // This datatype finished loading after the deadline imposed by the
425 // originating configuration cycle. Inform the DataTypeManager that the 423 // originating configuration cycle. Inform the DataTypeManager that the
426 // type has loaded, so that association may begin. 424 // type has loaded, so that association may begin.
427 result_processor_->OnTypesLoaded(); 425 result_processor_->OnTypesLoaded();
428 } else {
429 // If we're not IDLE or CONFIGURING, we're being invoked as part of an abort
430 // process (possibly a reconfiguration, or disabling of a broken data type).
431 DVLOG(1) << "ModelAssociationManager: ModelLoadCallback occurred while "
432 << "not IDLE or CONFIGURING. Doing nothing.";
433 } 426 }
434 427
435 } 428 }
436 429
437 void ModelAssociationManager::StartAssociatingNextType() { 430 void ModelAssociationManager::StartAssociatingNextType() {
438 DCHECK_EQ(state_, CONFIGURING); 431 DCHECK_EQ(state_, CONFIGURING);
439 DCHECK_EQ(currently_associating_, static_cast<DataTypeController*>(NULL)); 432 DCHECK_EQ(currently_associating_, static_cast<DataTypeController*>(NULL));
440 433
441 DVLOG(1) << "ModelAssociationManager: StartAssociatingNextType"; 434 DVLOG(1) << "ModelAssociationManager: StartAssociatingNextType";
442 if (!waiting_to_associate_.empty()) { 435 if (!waiting_to_associate_.empty()) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 } 495 }
503 return result; 496 return result;
504 } 497 }
505 498
506 base::OneShotTimer<ModelAssociationManager>* 499 base::OneShotTimer<ModelAssociationManager>*
507 ModelAssociationManager::GetTimerForTesting() { 500 ModelAssociationManager::GetTimerForTesting() {
508 return &timer_; 501 return &timer_;
509 } 502 }
510 503
511 } // namespace browser_sync 504 } // namespace browser_sync
505
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/model_association_manager.h ('k') | chrome/browser/sync/glue/model_association_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698