| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/sync/syncable/syncable.h" | 5 #include "chrome/browser/sync/syncable/syncable.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 #if defined(OS_POSIX) | 10 #if defined(OS_POSIX) |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 ENUM_CASE(VACUUM_AFTER_SAVE); | 83 ENUM_CASE(VACUUM_AFTER_SAVE); |
| 84 ENUM_CASE(PURGE_ENTRIES); | 84 ENUM_CASE(PURGE_ENTRIES); |
| 85 ENUM_CASE(SYNCAPI); | 85 ENUM_CASE(SYNCAPI); |
| 86 }; | 86 }; |
| 87 NOTREACHED(); | 87 NOTREACHED(); |
| 88 return ""; | 88 return ""; |
| 89 } | 89 } |
| 90 | 90 |
| 91 #undef ENUM_CASE | 91 #undef ENUM_CASE |
| 92 | 92 |
| 93 SharedEntryKernelMutationMap::SharedEntryKernelMutationMap() | |
| 94 : mutations_(new SharedMutationMap()) {} | |
| 95 | |
| 96 SharedEntryKernelMutationMap::SharedEntryKernelMutationMap( | |
| 97 EntryKernelMutationMap* mutations) | |
| 98 : mutations_(new SharedMutationMap(mutations)) {} | |
| 99 | |
| 100 SharedEntryKernelMutationMap::~SharedEntryKernelMutationMap() {} | |
| 101 | |
| 102 const EntryKernelMutationMap& SharedEntryKernelMutationMap::Get() const { | |
| 103 return mutations_->Get(); | |
| 104 } | |
| 105 | |
| 106 void SharedEntryKernelMutationMap::MutationMapTraits::Swap( | |
| 107 EntryKernelMutationMap* mutations1, EntryKernelMutationMap* mutations2) { | |
| 108 mutations1->swap(*mutations2); | |
| 109 } | |
| 110 | |
| 111 namespace { | 93 namespace { |
| 112 | 94 |
| 113 DictionaryValue* EntryKernelMutationToValue( | 95 DictionaryValue* EntryKernelMutationToValue( |
| 114 const EntryKernelMutation& mutation) { | 96 const EntryKernelMutation& mutation) { |
| 115 DictionaryValue* dict = new DictionaryValue(); | 97 DictionaryValue* dict = new DictionaryValue(); |
| 116 dict->Set("original", mutation.original.ToValue()); | 98 dict->Set("original", mutation.original.ToValue()); |
| 117 dict->Set("mutated", mutation.mutated.ToValue()); | 99 dict->Set("mutated", mutation.mutated.ToValue()); |
| 118 return dict; | 100 return dict; |
| 119 } | 101 } |
| 120 | 102 |
| (...skipping 1100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 // Insert only if it's not already there. | 1203 // Insert only if it's not already there. |
| 1222 const int64 handle = entry->ref(META_HANDLE); | 1204 const int64 handle = entry->ref(META_HANDLE); |
| 1223 EntryKernelMutationMap::iterator it = mutations_.lower_bound(handle); | 1205 EntryKernelMutationMap::iterator it = mutations_.lower_bound(handle); |
| 1224 if (it == mutations_.end() || it->first != handle) { | 1206 if (it == mutations_.end() || it->first != handle) { |
| 1225 EntryKernelMutation mutation; | 1207 EntryKernelMutation mutation; |
| 1226 mutation.original = *entry; | 1208 mutation.original = *entry; |
| 1227 ignore_result(mutations_.insert(it, std::make_pair(handle, mutation))); | 1209 ignore_result(mutations_.insert(it, std::make_pair(handle, mutation))); |
| 1228 } | 1210 } |
| 1229 } | 1211 } |
| 1230 | 1212 |
| 1231 SharedEntryKernelMutationMap WriteTransaction::RecordMutations() { | 1213 ImmutableEntryKernelMutationMap WriteTransaction::RecordMutations() { |
| 1232 dirkernel_->transaction_mutex.AssertAcquired(); | 1214 dirkernel_->transaction_mutex.AssertAcquired(); |
| 1233 for (syncable::EntryKernelMutationMap::iterator it = mutations_.begin(); | 1215 for (syncable::EntryKernelMutationMap::iterator it = mutations_.begin(); |
| 1234 it != mutations_.end(); ++it) { | 1216 it != mutations_.end(); ++it) { |
| 1235 EntryKernel* kernel = directory()->GetEntryByHandle(it->first); | 1217 EntryKernel* kernel = directory()->GetEntryByHandle(it->first); |
| 1236 if (!kernel) { | 1218 if (!kernel) { |
| 1237 NOTREACHED(); | 1219 NOTREACHED(); |
| 1238 continue; | 1220 continue; |
| 1239 } | 1221 } |
| 1240 it->second.mutated = *kernel; | 1222 it->second.mutated = *kernel; |
| 1241 } | 1223 } |
| 1242 return SharedEntryKernelMutationMap(&mutations_); | 1224 return ImmutableEntryKernelMutationMap(&mutations_); |
| 1243 } | 1225 } |
| 1244 | 1226 |
| 1245 void WriteTransaction::UnlockAndNotify( | 1227 void WriteTransaction::UnlockAndNotify( |
| 1246 const SharedEntryKernelMutationMap& mutations) { | 1228 const ImmutableEntryKernelMutationMap& mutations) { |
| 1247 // Work while transaction mutex is held. | 1229 // Work while transaction mutex is held. |
| 1248 ModelTypeBitSet models_with_changes; | 1230 ModelTypeBitSet models_with_changes; |
| 1249 bool has_mutations = !mutations.Get().empty(); | 1231 bool has_mutations = !mutations.Get().empty(); |
| 1250 if (has_mutations) { | 1232 if (has_mutations) { |
| 1251 models_with_changes = NotifyTransactionChangingAndEnding(mutations); | 1233 models_with_changes = NotifyTransactionChangingAndEnding(mutations); |
| 1252 } | 1234 } |
| 1253 Unlock(); | 1235 Unlock(); |
| 1254 | 1236 |
| 1255 // Work after mutex is relased. | 1237 // Work after mutex is relased. |
| 1256 if (has_mutations) { | 1238 if (has_mutations) { |
| 1257 NotifyTransactionComplete(models_with_changes); | 1239 NotifyTransactionComplete(models_with_changes); |
| 1258 } | 1240 } |
| 1259 } | 1241 } |
| 1260 | 1242 |
| 1261 ModelTypeBitSet WriteTransaction::NotifyTransactionChangingAndEnding( | 1243 ModelTypeBitSet WriteTransaction::NotifyTransactionChangingAndEnding( |
| 1262 const SharedEntryKernelMutationMap& mutations) { | 1244 const ImmutableEntryKernelMutationMap& mutations) { |
| 1263 dirkernel_->transaction_mutex.AssertAcquired(); | 1245 dirkernel_->transaction_mutex.AssertAcquired(); |
| 1264 DCHECK(!mutations.Get().empty()); | 1246 DCHECK(!mutations.Get().empty()); |
| 1265 | 1247 |
| 1266 DirectoryChangeDelegate* const delegate = dirkernel_->delegate; | 1248 DirectoryChangeDelegate* const delegate = dirkernel_->delegate; |
| 1267 if (writer_ == syncable::SYNCAPI) { | 1249 if (writer_ == syncable::SYNCAPI) { |
| 1268 delegate->HandleCalculateChangesChangeEventFromSyncApi( | 1250 delegate->HandleCalculateChangesChangeEventFromSyncApi( |
| 1269 mutations.Get(), this); | 1251 mutations.Get(), this); |
| 1270 } else { | 1252 } else { |
| 1271 delegate->HandleCalculateChangesChangeEventFromSyncer( | 1253 delegate->HandleCalculateChangesChangeEventFromSyncer( |
| 1272 mutations.Get(), this); | 1254 mutations.Get(), this); |
| 1273 } | 1255 } |
| 1274 | 1256 |
| 1275 ModelTypeBitSet models_with_changes = | 1257 ModelTypeBitSet models_with_changes = |
| 1276 delegate->HandleTransactionEndingChangeEvent(this); | 1258 delegate->HandleTransactionEndingChangeEvent(this); |
| 1277 | 1259 |
| 1278 dirkernel_->observers->Notify( | 1260 dirkernel_->observers->Notify( |
| 1279 &TransactionObserver::OnTransactionMutate, | 1261 &TransactionObserver::OnTransactionMutate, |
| 1280 from_here_, writer_, mutations, models_with_changes); | 1262 from_here_, writer_, mutations, models_with_changes); |
| 1281 | 1263 |
| 1282 return models_with_changes; | 1264 return models_with_changes; |
| 1283 } | 1265 } |
| 1284 | 1266 |
| 1285 void WriteTransaction::NotifyTransactionComplete( | 1267 void WriteTransaction::NotifyTransactionComplete( |
| 1286 ModelTypeBitSet models_with_changes) { | 1268 ModelTypeBitSet models_with_changes) { |
| 1287 dirkernel_->delegate->HandleTransactionCompleteChangeEvent( | 1269 dirkernel_->delegate->HandleTransactionCompleteChangeEvent( |
| 1288 models_with_changes); | 1270 models_with_changes); |
| 1289 } | 1271 } |
| 1290 | 1272 |
| 1291 WriteTransaction::~WriteTransaction() { | 1273 WriteTransaction::~WriteTransaction() { |
| 1292 const SharedEntryKernelMutationMap& mutations = RecordMutations(); | 1274 const ImmutableEntryKernelMutationMap& mutations = RecordMutations(); |
| 1293 | 1275 |
| 1294 if (OFF != kInvariantCheckLevel) { | 1276 if (OFF != kInvariantCheckLevel) { |
| 1295 const bool full_scan = (FULL_DB_VERIFICATION == kInvariantCheckLevel); | 1277 const bool full_scan = (FULL_DB_VERIFICATION == kInvariantCheckLevel); |
| 1296 if (full_scan) | 1278 if (full_scan) |
| 1297 directory()->CheckTreeInvariants(this, full_scan); | 1279 directory()->CheckTreeInvariants(this, full_scan); |
| 1298 else | 1280 else |
| 1299 directory()->CheckTreeInvariants(this, mutations.Get()); | 1281 directory()->CheckTreeInvariants(this, mutations.Get()); |
| 1300 } | 1282 } |
| 1301 | 1283 |
| 1302 UnlockAndNotify(mutations); | 1284 UnlockAndNotify(mutations); |
| (...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1959 CHECK(result); | 1941 CHECK(result); |
| 1960 for (iterator i = GetParentChildIndexLowerBound(lock, parent_id), | 1942 for (iterator i = GetParentChildIndexLowerBound(lock, parent_id), |
| 1961 end = GetParentChildIndexUpperBound(lock, parent_id); | 1943 end = GetParentChildIndexUpperBound(lock, parent_id); |
| 1962 i != end; ++i) { | 1944 i != end; ++i) { |
| 1963 DCHECK_EQ(parent_id, (*i)->ref(PARENT_ID)); | 1945 DCHECK_EQ(parent_id, (*i)->ref(PARENT_ID)); |
| 1964 result->push_back((*i)->ref(META_HANDLE)); | 1946 result->push_back((*i)->ref(META_HANDLE)); |
| 1965 } | 1947 } |
| 1966 } | 1948 } |
| 1967 | 1949 |
| 1968 } // namespace syncable | 1950 } // namespace syncable |
| OLD | NEW |