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 |