Chromium Code Reviews| 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> |
| 11 #include <cstddef> | |
| 11 #include <iosfwd> | 12 #include <iosfwd> |
| 12 #include <limits> | 13 #include <limits> |
| 13 #include <map> | 14 #include <map> |
| 14 #include <set> | 15 #include <set> |
| 15 #include <string> | 16 #include <string> |
| 16 #include <vector> | 17 #include <vector> |
| 17 | 18 |
| 18 #include "base/atomicops.h" | 19 #include "base/atomicops.h" |
| 19 #include "base/basictypes.h" | 20 #include "base/basictypes.h" |
| 20 #include "base/file_path.h" | 21 #include "base/file_path.h" |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 559 typedef std::set<EntryKernel, EntryKernelLessByMetaHandle> EntryKernelSet; | 560 typedef std::set<EntryKernel, EntryKernelLessByMetaHandle> EntryKernelSet; |
| 560 | 561 |
| 561 struct EntryKernelMutation { | 562 struct EntryKernelMutation { |
| 562 EntryKernel original, mutated; | 563 EntryKernel original, mutated; |
| 563 }; | 564 }; |
| 564 typedef std::map<int64, EntryKernelMutation> EntryKernelMutationMap; | 565 typedef std::map<int64, EntryKernelMutation> EntryKernelMutationMap; |
| 565 | 566 |
| 566 typedef browser_sync::Immutable<EntryKernelMutationMap> | 567 typedef browser_sync::Immutable<EntryKernelMutationMap> |
| 567 ImmutableEntryKernelMutationMap; | 568 ImmutableEntryKernelMutationMap; |
| 568 | 569 |
| 570 // a WriteTransaction has a writer tag describing which body of code is doing | |
|
tim (not reviewing)
2011/09/21 16:12:03
nit 'A WriteTransaction'
akalin
2011/09/21 19:49:38
Done.
| |
| 571 // the write. This is defined up here since WriteTransactionInfo also contains | |
| 572 // one. | |
| 573 enum WriterTag { | |
| 574 INVALID, | |
| 575 SYNCER, | |
| 576 AUTHWATCHER, | |
| 577 UNITTEST, | |
| 578 VACUUM_AFTER_SAVE, | |
| 579 PURGE_ENTRIES, | |
| 580 SYNCAPI | |
| 581 }; | |
| 582 | |
| 583 // Make sure to update this if you update WriterTag. | |
| 584 std::string WriterTagToString(WriterTag writer_tag); | |
| 585 | |
| 586 struct WriteTransactionInfo { | |
| 587 WriteTransactionInfo(int64 id, | |
| 588 tracked_objects::Location location, | |
| 589 WriterTag writer, | |
| 590 ImmutableEntryKernelMutationMap mutations); | |
| 591 WriteTransactionInfo(); | |
| 592 ~WriteTransactionInfo(); | |
| 593 | |
| 594 // Caller owns the return value. | |
| 595 base::DictionaryValue* ToValue(size_t max_mutations_size) const; | |
| 596 | |
| 597 int64 id; | |
| 598 // TODO(akalin): Use Location when it becomes assignable. | |
| 599 std::string location_string; | |
| 600 WriterTag writer; | |
| 601 ImmutableEntryKernelMutationMap mutations; | |
| 602 }; | |
| 603 | |
| 604 typedef | |
| 605 browser_sync::Immutable<WriteTransactionInfo> | |
| 606 ImmutableWriteTransactionInfo; | |
| 607 | |
| 608 // Caller owns the return value. | |
| 609 base::DictionaryValue* EntryKernelMutationToValue( | |
| 610 const EntryKernelMutation& mutation); | |
| 611 | |
| 569 // Caller owns the return value. | 612 // Caller owns the return value. |
| 570 base::ListValue* EntryKernelMutationMapToValue( | 613 base::ListValue* EntryKernelMutationMapToValue( |
| 571 const EntryKernelMutationMap& mutations); | 614 const EntryKernelMutationMap& mutations); |
| 572 | 615 |
| 573 // How syncable indices & Indexers work. | 616 // How syncable indices & Indexers work. |
| 574 // | 617 // |
| 575 // The syncable Directory maintains several indices on the Entries it tracks. | 618 // The syncable Directory maintains several indices on the Entries it tracks. |
| 576 // The indices follow a common pattern: | 619 // The indices follow a common pattern: |
| 577 // (a) The index allows efficient lookup of an Entry* with particular | 620 // (a) The index allows efficient lookup of an Entry* with particular |
| 578 // field values. This is done by use of a std::set<> and a custom | 621 // field values. This is done by use of a std::set<> and a custom |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 633 static bool ShouldInclude(const EntryKernel* a); | 676 static bool ShouldInclude(const EntryKernel* a); |
| 634 }; | 677 }; |
| 635 | 678 |
| 636 // Given an Indexer providing the semantics of an index, defines the | 679 // Given an Indexer providing the semantics of an index, defines the |
| 637 // set type used to actually contain the index. | 680 // set type used to actually contain the index. |
| 638 template <typename Indexer> | 681 template <typename Indexer> |
| 639 struct Index { | 682 struct Index { |
| 640 typedef std::set<EntryKernel*, typename Indexer::Comparator> Set; | 683 typedef std::set<EntryKernel*, typename Indexer::Comparator> Set; |
| 641 }; | 684 }; |
| 642 | 685 |
| 643 // a WriteTransaction has a writer tag describing which body of code is doing | |
| 644 // the write. This is defined up here since DirectoryChangeEvent also contains | |
| 645 // one. | |
| 646 enum WriterTag { | |
| 647 INVALID, | |
| 648 SYNCER, | |
| 649 AUTHWATCHER, | |
| 650 UNITTEST, | |
| 651 VACUUM_AFTER_SAVE, | |
| 652 PURGE_ENTRIES, | |
| 653 SYNCAPI | |
| 654 }; | |
| 655 | |
| 656 // Make sure to update this if you update WriterTag. | |
| 657 std::string WriterTagToString(WriterTag writer_tag); | |
| 658 | |
| 659 // The name Directory in this case means the entire directory | 686 // The name Directory in this case means the entire directory |
| 660 // structure within a single user account. | 687 // structure within a single user account. |
| 661 // | 688 // |
| 662 // Sqlite is a little goofy, in that each thread must access a database | 689 // Sqlite is a little goofy, in that each thread must access a database |
| 663 // via its own handle. So, a Directory object should only be accessed | 690 // via its own handle. So, a Directory object should only be accessed |
| 664 // from a single thread. Use DirectoryManager's Open() method to | 691 // from a single thread. Use DirectoryManager's Open() method to |
| 665 // always get a directory that has been properly initialized on the | 692 // always get a directory that has been properly initialized on the |
| 666 // current thread. | 693 // current thread. |
| 667 // | 694 // |
| 668 // The db is protected against concurrent modification by a reader/ | 695 // The db is protected against concurrent modification by a reader/ |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 992 void AddRef(); // For convenience. | 1019 void AddRef(); // For convenience. |
| 993 void Release(); | 1020 void Release(); |
| 994 | 1021 |
| 995 FilePath const db_path; | 1022 FilePath const db_path; |
| 996 // TODO(timsteele): audit use of the member and remove if possible | 1023 // TODO(timsteele): audit use of the member and remove if possible |
| 997 volatile base::subtle::AtomicWord refcount; | 1024 volatile base::subtle::AtomicWord refcount; |
| 998 | 1025 |
| 999 // Implements ReadTransaction / WriteTransaction using a simple lock. | 1026 // Implements ReadTransaction / WriteTransaction using a simple lock. |
| 1000 base::Lock transaction_mutex; | 1027 base::Lock transaction_mutex; |
| 1001 | 1028 |
| 1029 // Protected by transaction_mutex. Used by WriteTransactions. | |
| 1030 int64 next_write_transaction_id; | |
| 1031 | |
| 1002 // The name of this directory. | 1032 // The name of this directory. |
| 1003 std::string const name; | 1033 std::string const name; |
| 1004 | 1034 |
| 1005 // Protects all members below. | 1035 // Protects all members below. |
| 1006 // The mutex effectively protects all the indices, but not the | 1036 // The mutex effectively protects all the indices, but not the |
| 1007 // entries themselves. So once a pointer to an entry is pulled | 1037 // entries themselves. So once a pointer to an entry is pulled |
| 1008 // from the index, the mutex can be unlocked and entry read or written. | 1038 // from the index, the mutex can be unlocked and entry read or written. |
| 1009 // | 1039 // |
| 1010 // Never hold the mutex and do anything with the database or any | 1040 // Never hold the mutex and do anything with the database or any |
| 1011 // other buffered IO. Violating this rule will result in deadlock. | 1041 // other buffered IO. Violating this rule will result in deadlock. |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1035 | 1065 |
| 1036 // These 3 members are backed in the share_info table, and | 1066 // These 3 members are backed in the share_info table, and |
| 1037 // their state is marked by the flag above. | 1067 // their state is marked by the flag above. |
| 1038 | 1068 |
| 1039 // A structure containing the Directory state that is written back into the | 1069 // A structure containing the Directory state that is written back into the |
| 1040 // database on SaveChanges. | 1070 // database on SaveChanges. |
| 1041 PersistedKernelInfo persisted_info; | 1071 PersistedKernelInfo persisted_info; |
| 1042 | 1072 |
| 1043 // A unique identifier for this account's cache db, used to generate | 1073 // A unique identifier for this account's cache db, used to generate |
| 1044 // unique server IDs. No need to lock, only written at init time. | 1074 // unique server IDs. No need to lock, only written at init time. |
| 1045 std::string cache_guid; | 1075 const std::string cache_guid; |
| 1046 | 1076 |
| 1047 // It doesn't make sense for two threads to run SaveChanges at the same | 1077 // It doesn't make sense for two threads to run SaveChanges at the same |
| 1048 // time; this mutex protects that activity. | 1078 // time; this mutex protects that activity. |
| 1049 base::Lock save_changes_mutex; | 1079 base::Lock save_changes_mutex; |
| 1050 | 1080 |
| 1051 // The next metahandle is protected by kernel mutex. | 1081 // The next metahandle is protected by kernel mutex. |
| 1052 int64 next_metahandle; | 1082 int64 next_metahandle; |
| 1053 | 1083 |
| 1054 // Keep a history of recently flushed metahandles for debugging | 1084 // Keep a history of recently flushed metahandles for debugging |
| 1055 // purposes. Protected by the save_changes_mutex. | 1085 // purposes. Protected by the save_changes_mutex. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1190 | 1220 |
| 1191 // This is not a reset. It just sets the numeric fields which are not | 1221 // This is not a reset. It just sets the numeric fields which are not |
| 1192 // initialized by the constructor to zero. | 1222 // initialized by the constructor to zero. |
| 1193 void ZeroFields(EntryKernel* entry, int first_field); | 1223 void ZeroFields(EntryKernel* entry, int first_field); |
| 1194 | 1224 |
| 1195 } // namespace syncable | 1225 } // namespace syncable |
| 1196 | 1226 |
| 1197 std::ostream& operator <<(std::ostream&, const syncable::Blob&); | 1227 std::ostream& operator <<(std::ostream&, const syncable::Blob&); |
| 1198 | 1228 |
| 1199 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ | 1229 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ |
| OLD | NEW |