| 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 #ifndef CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ | 5 #ifndef CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ |
| 6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ | 6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <bitset> | 10 #include <bitset> |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "base/synchronization/lock.h" | 25 #include "base/synchronization/lock.h" |
| 26 #include "base/time.h" | 26 #include "base/time.h" |
| 27 #include "base/tracked.h" | 27 #include "base/tracked.h" |
| 28 #include "chrome/browser/sync/protocol/sync.pb.h" | 28 #include "chrome/browser/sync/protocol/sync.pb.h" |
| 29 #include "chrome/browser/sync/syncable/blob.h" | 29 #include "chrome/browser/sync/syncable/blob.h" |
| 30 #include "chrome/browser/sync/syncable/dir_open_result.h" | 30 #include "chrome/browser/sync/syncable/dir_open_result.h" |
| 31 #include "chrome/browser/sync/syncable/directory_event.h" | 31 #include "chrome/browser/sync/syncable/directory_event.h" |
| 32 #include "chrome/browser/sync/syncable/syncable_id.h" | 32 #include "chrome/browser/sync/syncable/syncable_id.h" |
| 33 #include "chrome/browser/sync/syncable/model_type.h" | 33 #include "chrome/browser/sync/syncable/model_type.h" |
| 34 #include "chrome/browser/sync/util/dbgq.h" | 34 #include "chrome/browser/sync/util/dbgq.h" |
| 35 #include "chrome/browser/sync/util/shared_value.h" | 35 #include "chrome/browser/sync/util/immutable.h" |
| 36 | 36 |
| 37 struct PurgeInfo; | 37 struct PurgeInfo; |
| 38 | 38 |
| 39 namespace base { | 39 namespace base { |
| 40 class DictionaryValue; | 40 class DictionaryValue; |
| 41 class ListValue; | 41 class ListValue; |
| 42 } | 42 } |
| 43 | 43 |
| 44 namespace sync_api { | 44 namespace sync_api { |
| 45 class ReadTransaction; | 45 class ReadTransaction; |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 return a.ref(META_HANDLE) < b.ref(META_HANDLE); | 556 return a.ref(META_HANDLE) < b.ref(META_HANDLE); |
| 557 } | 557 } |
| 558 }; | 558 }; |
| 559 typedef std::set<EntryKernel, EntryKernelLessByMetaHandle> EntryKernelSet; | 559 typedef std::set<EntryKernel, EntryKernelLessByMetaHandle> EntryKernelSet; |
| 560 | 560 |
| 561 struct EntryKernelMutation { | 561 struct EntryKernelMutation { |
| 562 EntryKernel original, mutated; | 562 EntryKernel original, mutated; |
| 563 }; | 563 }; |
| 564 typedef std::map<int64, EntryKernelMutation> EntryKernelMutationMap; | 564 typedef std::map<int64, EntryKernelMutation> EntryKernelMutationMap; |
| 565 | 565 |
| 566 // A thread-safe wrapper around an immutable mutation map. Used for | 566 typedef browser_sync::Immutable<EntryKernelMutationMap> |
| 567 // passing around mutation maps without incurring lots of copies. | 567 ImmutableEntryKernelMutationMap; |
| 568 class SharedEntryKernelMutationMap { | |
| 569 public: | |
| 570 SharedEntryKernelMutationMap(); | |
| 571 // Takes over the data in |mutations|, leaving |mutations| empty. | |
| 572 explicit SharedEntryKernelMutationMap(EntryKernelMutationMap* mutations); | |
| 573 | |
| 574 ~SharedEntryKernelMutationMap(); | |
| 575 | |
| 576 const EntryKernelMutationMap& Get() const; | |
| 577 | |
| 578 private: | |
| 579 struct MutationMapTraits { | |
| 580 static void Swap(EntryKernelMutationMap* mutations1, | |
| 581 EntryKernelMutationMap* mutations2); | |
| 582 }; | |
| 583 | |
| 584 typedef browser_sync::SharedValue<EntryKernelMutationMap, MutationMapTraits> | |
| 585 SharedMutationMap; | |
| 586 | |
| 587 scoped_refptr<const SharedMutationMap> mutations_; | |
| 588 }; | |
| 589 | 568 |
| 590 // Caller owns the return value. | 569 // Caller owns the return value. |
| 591 base::ListValue* EntryKernelMutationMapToValue( | 570 base::ListValue* EntryKernelMutationMapToValue( |
| 592 const EntryKernelMutationMap& mutations); | 571 const EntryKernelMutationMap& mutations); |
| 593 | 572 |
| 594 // How syncable indices & Indexers work. | 573 // How syncable indices & Indexers work. |
| 595 // | 574 // |
| 596 // The syncable Directory maintains several indices on the Entries it tracks. | 575 // The syncable Directory maintains several indices on the Entries it tracks. |
| 597 // The indices follow a common pattern: | 576 // The indices follow a common pattern: |
| 598 // (a) The index allows efficient lookup of an Entry* with particular | 577 // (a) The index allows efficient lookup of an Entry* with particular |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1181 | 1160 |
| 1182 void SaveOriginal(const EntryKernel* entry); | 1161 void SaveOriginal(const EntryKernel* entry); |
| 1183 | 1162 |
| 1184 protected: | 1163 protected: |
| 1185 // Overridden by tests. | 1164 // Overridden by tests. |
| 1186 virtual void NotifyTransactionComplete( | 1165 virtual void NotifyTransactionComplete( |
| 1187 ModelTypeBitSet models_with_changes); | 1166 ModelTypeBitSet models_with_changes); |
| 1188 | 1167 |
| 1189 private: | 1168 private: |
| 1190 // Clears |mutations_|. | 1169 // Clears |mutations_|. |
| 1191 SharedEntryKernelMutationMap RecordMutations(); | 1170 ImmutableEntryKernelMutationMap RecordMutations(); |
| 1192 | 1171 |
| 1193 void UnlockAndNotify(const SharedEntryKernelMutationMap& mutations); | 1172 void UnlockAndNotify(const ImmutableEntryKernelMutationMap& mutations); |
| 1194 | 1173 |
| 1195 ModelTypeBitSet NotifyTransactionChangingAndEnding( | 1174 ModelTypeBitSet NotifyTransactionChangingAndEnding( |
| 1196 const SharedEntryKernelMutationMap& mutations); | 1175 const ImmutableEntryKernelMutationMap& mutations); |
| 1197 | 1176 |
| 1198 // Only the original fields are filled in until |RecordMutations()|. | 1177 // Only the original fields are filled in until |RecordMutations()|. |
| 1199 // We use a mutation map instead of a kernel set to avoid copying. | 1178 // We use a mutation map instead of a kernel set to avoid copying. |
| 1200 EntryKernelMutationMap mutations_; | 1179 EntryKernelMutationMap mutations_; |
| 1201 | 1180 |
| 1202 DISALLOW_COPY_AND_ASSIGN(WriteTransaction); | 1181 DISALLOW_COPY_AND_ASSIGN(WriteTransaction); |
| 1203 }; | 1182 }; |
| 1204 | 1183 |
| 1205 bool IsLegalNewParent(BaseTransaction* trans, const Id& id, const Id& parentid); | 1184 bool IsLegalNewParent(BaseTransaction* trans, const Id& id, const Id& parentid); |
| 1206 | 1185 |
| 1207 int64 Now(); | 1186 int64 Now(); |
| 1208 | 1187 |
| 1209 // This function sets only the flags needed to get this entry to sync. | 1188 // This function sets only the flags needed to get this entry to sync. |
| 1210 void MarkForSyncing(syncable::MutableEntry* e); | 1189 void MarkForSyncing(syncable::MutableEntry* e); |
| 1211 | 1190 |
| 1212 // This is not a reset. It just sets the numeric fields which are not | 1191 // This is not a reset. It just sets the numeric fields which are not |
| 1213 // initialized by the constructor to zero. | 1192 // initialized by the constructor to zero. |
| 1214 void ZeroFields(EntryKernel* entry, int first_field); | 1193 void ZeroFields(EntryKernel* entry, int first_field); |
| 1215 | 1194 |
| 1216 } // namespace syncable | 1195 } // namespace syncable |
| 1217 | 1196 |
| 1218 std::ostream& operator <<(std::ostream&, const syncable::Blob&); | 1197 std::ostream& operator <<(std::ostream&, const syncable::Blob&); |
| 1219 | 1198 |
| 1220 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ | 1199 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ |
| OLD | NEW |