Chromium Code Reviews| Index: sync/internal_api/sync_manager_impl.cc |
| diff --git a/sync/internal_api/sync_manager_impl.cc b/sync/internal_api/sync_manager_impl.cc |
| index eb86bb43bc17e2700d183966bd36a49523ad8c09..292041c00ade3705a664ed4ee9818ec51d4f7625 100644 |
| --- a/sync/internal_api/sync_manager_impl.cc |
| +++ b/sync/internal_api/sync_manager_impl.cc |
| @@ -270,14 +270,6 @@ bool SyncManagerImpl::VisiblePropertiesDiffer( |
| return false; |
| } |
| -bool SyncManagerImpl::ChangeBuffersAreEmpty() { |
| - for (int i = 0; i < MODEL_TYPE_COUNT; ++i) { |
| - if (!change_buffers_[i].IsEmpty()) |
| - return false; |
| - } |
| - return true; |
| -} |
| - |
| void SyncManagerImpl::ThrowUnrecoverableError() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| ReadTransaction trans(FROM_HERE, GetUserShare()); |
| @@ -774,7 +766,7 @@ SyncManagerImpl::HandleTransactionEndingChangeEvent( |
| // This notification happens immediately before a syncable WriteTransaction |
| // falls out of scope. It happens while the channel mutex is still held, |
| // and while the transaction mutex is held, so it cannot be re-entrant. |
| - if (!change_delegate_ || ChangeBuffersAreEmpty()) |
| + if (!change_delegate_ || change_records_.empty()) |
| return ModelTypeSet(); |
| // This will continue the WriteTransaction using a read only wrapper. |
| @@ -784,40 +776,28 @@ SyncManagerImpl::HandleTransactionEndingChangeEvent( |
| ReadTransaction read_trans(GetUserShare(), trans); |
| ModelTypeSet models_with_changes; |
| - for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { |
| - const ModelType type = ModelTypeFromInt(i); |
| - if (change_buffers_[type].IsEmpty()) |
| - continue; |
| - |
| - ImmutableChangeRecordList ordered_changes; |
| - // TODO(akalin): Propagate up the error further (see |
| - // http://crbug.com/100907). |
| - CHECK(change_buffers_[type].GetAllChangesInTreeOrder(&read_trans, |
| - &ordered_changes)); |
| - if (!ordered_changes.Get().empty()) { |
| - // Increment transaction version so that change processor can read |
| - // updated value and set it in native model after changes are applied. |
| - trans->directory()->IncrementTransactionVersion(type); |
| - |
| - change_delegate_-> |
| - OnChangesApplied(type, |
| - trans->directory()->GetTransactionVersion(type), |
| - &read_trans, ordered_changes); |
| - change_observer_.Call(FROM_HERE, |
| - &SyncManager::ChangeObserver::OnChangesApplied, |
| - type, write_transaction_info.Get().id, ordered_changes); |
| - models_with_changes.Put(type); |
| - } |
| - change_buffers_[i].Clear(); |
| + for (ChangeRecordMap::const_iterator it = change_records_.begin(); |
| + it != change_records_.end(); ++it) { |
| + DCHECK(!it->second.Get().empty()); |
| + ModelType type = ModelTypeFromInt(it->first); |
| + change_delegate_-> |
| + OnChangesApplied(type, trans->directory()->GetTransactionVersion(type), |
| + &read_trans, it->second); |
| + change_observer_.Call(FROM_HERE, |
| + &SyncManager::ChangeObserver::OnChangesApplied, |
| + type, write_transaction_info.Get().id, it->second); |
| + models_with_changes.Put(type); |
| } |
| + change_records_.clear(); |
| return models_with_changes; |
| } |
| void SyncManagerImpl::HandleCalculateChangesChangeEventFromSyncApi( |
| const ImmutableWriteTransactionInfo& write_transaction_info, |
| - syncable::BaseTransaction* trans) { |
| + syncable::BaseTransaction* trans, |
| + std::vector<int64>* entry_changed) { |
| // We have been notified about a user action changing a sync model. |
| - LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << |
| + LOG_IF(WARNING, !change_records_.empty()) << |
| "CALCULATE_CHANGES called with unapplied old changes."; |
| // The mutated model type, or UNSPECIFIED if nothing was mutated. |
| @@ -841,6 +821,7 @@ void SyncManagerImpl::HandleCalculateChangesChangeEventFromSyncApi( |
| // Found real mutation. |
| if (model_type != UNSPECIFIED) { |
| mutated_model_types.Put(model_type); |
| + entry_changed->push_back(it->second.mutated.ref(syncable::META_HANDLE)); |
| } |
| } |
| @@ -889,12 +870,15 @@ void SyncManagerImpl::SetExtraChangeRecordData(int64 id, |
| void SyncManagerImpl::HandleCalculateChangesChangeEventFromSyncer( |
| const ImmutableWriteTransactionInfo& write_transaction_info, |
| - syncable::BaseTransaction* trans) { |
| + syncable::BaseTransaction* trans, |
| + std::vector<int64>* entry_changed) { |
| // We only expect one notification per sync step, so change_buffers_ should |
| // contain no pending entries. |
| - LOG_IF(WARNING, !ChangeBuffersAreEmpty()) << |
| + LOG_IF(WARNING, !change_records_.empty()) << |
| "CALCULATE_CHANGES called with unapplied old changes."; |
| + ChangeReorderBuffer change_buffers[MODEL_TYPE_COUNT]; |
| + |
| Cryptographer* crypto = directory()->GetCryptographer(trans); |
| const syncable::ImmutableEntryKernelMutationMap& mutations = |
| write_transaction_info.Get().mutations; |
| @@ -911,18 +895,31 @@ void SyncManagerImpl::HandleCalculateChangesChangeEventFromSyncer( |
| int64 handle = it->first; |
| if (exists_now && !existed_before) |
| - change_buffers_[type].PushAddedItem(handle); |
| + change_buffers[type].PushAddedItem(handle); |
| else if (!exists_now && existed_before) |
| - change_buffers_[type].PushDeletedItem(handle); |
| + change_buffers[type].PushDeletedItem(handle); |
| else if (exists_now && existed_before && |
| VisiblePropertiesDiffer(it->second, crypto)) { |
| - change_buffers_[type].PushUpdatedItem( |
| + change_buffers[type].PushUpdatedItem( |
| handle, VisiblePositionsDiffer(it->second)); |
| } |
| - SetExtraChangeRecordData(handle, type, &change_buffers_[type], crypto, |
| + SetExtraChangeRecordData(handle, type, &change_buffers[type], crypto, |
| it->second.original, existed_before, exists_now); |
| } |
| + |
| + ReadTransaction read_trans(GetUserShare(), trans); |
| + for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { |
| + if (!change_buffers[i].IsEmpty()) { |
| + if (change_buffers[i].GetAllChangesInTreeOrder(&read_trans, |
| + &(change_records_[i]))) { |
| + for (uint32 j = 0; j < change_records_[i].Get().size(); ++j) |
|
tim (not reviewing)
2012/11/08 17:38:49
prefer size_t
haitaol1
2012/11/08 19:06:53
Done.
|
| + entry_changed->push_back((change_records_[i].Get())[j].id); |
| + } |
| + if (change_records_[i].Get().empty()) |
| + change_records_.erase(i); |
| + } |
| + } |
| } |
| TimeDelta SyncManagerImpl::GetNudgeDelayTimeDelta( |