Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: chrome/browser/sync/glue/tab_node_pool.h

Issue 16421003: [Sync] Add logic to reassociate tab nodes after restart. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix win compile, rename uint -> size_t. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_GLUE_TAB_NODE_POOL_H_ 5 #ifndef CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_
6 #define CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_ 6 #define CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_
7 7
8 #include <map>
9 #include <set>
8 #include <string> 10 #include <string>
9 #include <vector>
10 11
11 #include "base/basictypes.h" 12 #include "base/basictypes.h"
13 #include "base/gtest_prod_util.h"
14 #include "chrome/browser/sessions/session_id.h"
12 15
13 class ProfileSyncService; 16 class ProfileSyncService;
14 17
15 namespace browser_sync { 18 namespace browser_sync {
16 19
17 // A pool for managing free/used tab sync nodes. Performs lazy creation 20 // A pool for managing free/used tab sync nodes. Performs lazy creation
18 // of sync nodes when necessary. 21 // of sync nodes when necessary.
19 class TabNodePool { 22 class TabNodePool {
20 public: 23 public:
21 explicit TabNodePool(ProfileSyncService* sync_service); 24 explicit TabNodePool(ProfileSyncService* sync_service);
22 ~TabNodePool(); 25 ~TabNodePool();
23 26 enum InvalidTab {
27 kInvalidTabID = -1
28 };
24 // Build a sync tag from tab_node_id. 29 // Build a sync tag from tab_node_id.
25 static std::string TabIdToTag(const std::string machine_tag, 30 static std::string TabIdToTag(const std::string machine_tag,
26 size_t tab_node_id); 31 size_t tab_node_id);
27 32
28 // Add a previously allocated tab sync node to our pool. Increases the size
29 // of tab_syncid_pool_ by one and marks the new tab node as free.
30 // Note: this should only be called when we discover tab sync nodes from
31 // previous sessions, not for freeing tab nodes we created through
32 // GetFreeTabNode (use FreeTabNode below for that).
33 void AddTabNode(int64 sync_id);
34
35 // Returns the sync_id for the next free tab node. If none are available, 33 // Returns the sync_id for the next free tab node. If none are available,
36 // creates a new tab node. 34 // creates a new tab node and adds it to free nodes pool. The free node can
35 // then be used to associate with a tab by calling AssociateTabNode.
Nicolas Zea 2013/06/19 21:35:33 Mention explicitly that the node is still consider
shashi 2013/06/20 00:49:32 Updated the comment. AssociateTabNode does the act
37 // Note: We make use of the following "id's" 36 // Note: We make use of the following "id's"
Nicolas Zea 2013/06/19 21:35:33 I think at this point this section on what the ids
shashi 2013/06/20 00:49:32 Done On 2013/06/19 21:35:33, Nicolas Zea wrote:
38 // - a sync_id: an int64 used in |syncer::InitByIdLookup| 37 // - a sync_id: an int64 used in |syncer::InitByIdLookup|
39 // - a tab_id: created by session service, unique to this client 38 // - a tab_id: created by session service, unique to this client
40 // - a tab_node_id: the id for a particular sync tab node. This is used 39 // - a tab_node_id: the id for a particular sync tab node. This is used
41 // to generate the sync tab node tag through: 40 // to generate the sync tab node tag through:
42 // tab_tag = StringPrintf("%s_%ui", local_session_tag, tab_node_id); 41 // tab_tag = StringPrintf("%s_%ui", local_session_tag, tab_node_id);
43 // tab_node_id and sync_id are both unique to a particular sync node. The 42 // tab_node_id and sync_id are both unique to a particular sync node. The
44 // difference is that tab_node_id is controlled by the model associator and 43 // difference is that tab_node_id is controlled by the model associator and
45 // is used when creating a new sync node, which returns the sync_id, created 44 // is used when creating a new sync node, which returns the sync_id, created
46 // by the sync db. 45 // by the sync db.
47 int64 GetFreeTabNode(); 46 int64 GetFreeTabNode();
48 47
49 // Return a tab node to our free pool. 48 // Removes the node from |tab_syncid_tab_id_map_| and returns the node to free
50 // Note: the difference between FreeTabNode and AddTabNode is that 49 // pool.
51 // FreeTabNode does not modify the size of |tab_syncid_pool_|, while
52 // AddTabNode increases it by one. In the case of FreeTabNode, the size of
53 // the |tab_syncid_pool_| should always be equal to the amount of tab nodes
54 // associated with this machine.
55 void FreeTabNode(int64 sync_id); 50 void FreeTabNode(int64 sync_id);
56 51
52 // Removes |sync_id| from free node pool and associates it with |tab_id|.
53 // sync_id should be id of a free node. In order to associate a non free
54 // sync node, use ReassociateTabNode.
55 void AssociateTabNode(int64 sync_id, SessionID::id_type tab_id);
56
57 // Associate sync_id with tab_id but does not add it to free node pool.
58 // Note: this should only be called when we discover tab sync nodes from
59 // previous sessions, not for freeing tab nodes we created through
60 // GetFreeTabNode (use FreeTabNode below for that).
61 // The difference between AddTabNode and AssociateTabNode is that
62 // AssociateTabNode requires the sync node to be free to be associated.
63 // AddTabNode just adds the association.
64 void AddTabNode(int64 sync_id, const SessionID& tab_id, size_t tab_node_id);
65
66 // Returns the tab_id for |sync_id| if it exists else returns kInvalidTabID.
67 SessionID::id_type TabIDForSyncID(int64 sync_id) const;
Nicolas Zea 2013/06/19 21:35:33 Rename to GetTabIdFromSyncId
shashi 2013/06/20 00:49:32 Done.
68
69 // Reassociates sync node with id |sync_id| with tab node with |tab_id|.
70 // Returns true if it is able to reassociate the node, false if sync node
Nicolas Zea 2013/06/19 21:35:33 "if a sync node with id |sync_id|"
shashi 2013/06/20 00:49:32 Done.
71 // with |sync_id| is not associated with any tab.
72 bool ReassociateTabNode(int64 sync_id, SessionID::id_type tab_id);
73
74 // Returns any nodes with sync_ids not in |used_synced_ids| to free node pool.
75 void FreeUnusedTabNodes(const std::set<int64>& used_sync_ids);
76
57 // Clear tab pool. 77 // Clear tab pool.
58 void clear() { 78 void clear() {
Nicolas Zea 2013/06/19 21:35:33 nit: this was violating style guide before too, bu
shashi 2013/06/20 00:49:32 Done.
59 tab_syncid_pool_.clear(); 79 free_nodes_pool_.clear();
60 tab_pool_fp_ = -1; 80 tab_syncid_tab_id_map_.clear();
81 max_used_tab_node_id_ = 0;
61 } 82 }
62 83
63 // Return the number of tab nodes this client currently has allocated 84 // Return the number of tab nodes this client currently has allocated
64 // (including both free and used nodes) 85 // (including both free and used nodes)
65 size_t capacity() const { return tab_syncid_pool_.size(); } 86 size_t capacity() const {
87 return tab_syncid_tab_id_map_.size() + free_nodes_pool_.size();
88 }
66 89
67 // Return empty status (all tab nodes are in use). 90 // Return empty status (all tab nodes are in use).
68 bool empty() const { return tab_pool_fp_ == -1; } 91 bool empty() const { return free_nodes_pool_.empty(); }
69 92
70 // Return full status (no tab nodes are in use). 93 // Return full status (no tab nodes are in use).
71 bool full() { 94 bool full() { return tab_syncid_tab_id_map_.empty(); }
72 return tab_pool_fp_ == static_cast<int64>(tab_syncid_pool_.size())-1;
73 }
74 95
75 void set_machine_tag(const std::string& machine_tag) { 96 void set_machine_tag(const std::string& machine_tag) {
76 machine_tag_ = machine_tag; 97 machine_tag_ = machine_tag;
77 } 98 }
78 99
79 private: 100 private:
80 // Pool of all available syncid's for tab's we have created. 101 FRIEND_TEST_ALL_PREFIXES(SyncTabNodePoolTest, TabNodeIdIncreases);
Nicolas Zea 2013/06/19 21:35:33 I prefer friending a test class, and then having t
shashi 2013/06/20 00:49:32 Thanks, done, it is more cleaner now :). On 2013/0
81 std::vector<int64> tab_syncid_pool_; 102 typedef std::map<int64, SessionID::id_type> SyncIDToTabIDMap;
82 103
83 // Free pointer for tab pool. Only those node id's, up to and including the 104 // Stores mapping of sync_ids associated with tab_ids, these are the used
84 // one indexed by the free pointer, are valid and free. The rest of the 105 // nodes of tab node pool.
85 // |tab_syncid_pool_| is invalid because the nodes are in use. 106 // The nodes in the map can be returned to free tab node pool by calling
86 // To get the next free node, use tab_syncid_pool_[tab_pool_fp_--]. 107 // FreeTabNode(sync_id).
87 int64 tab_pool_fp_; 108 SyncIDToTabIDMap tab_syncid_tab_id_map_;
Nicolas Zea 2013/06/19 21:35:33 I think it's implied that sync ids belong to tabs,
shashi 2013/06/20 00:49:32 Done.
88 109
89 // The machiine tag associated with this tab pool. Used in the title of new 110 // The set of free nodes in the free node pool.
Nicolas Zea 2013/06/19 21:35:33 "The sync ids for the set of free sync nodes" is a
shashi 2013/06/20 00:49:32 On 2013/06/19 21:35:33, Nicolas Zea wrote: > "The
111 std::set<int64> free_nodes_pool_;
112
113 // The maximum used tab_node id for a sync node. A new sync node will always
114 // be created with max_used_tab_node_id_ + 1.
115 size_t max_used_tab_node_id_;
116
117 // The machine tag associated with this tab pool. Used in the title of new
90 // sync nodes. 118 // sync nodes.
91 std::string machine_tag_; 119 std::string machine_tag_;
92 120
93 // Our sync service profile (for making changes to the sync db) 121 // Our sync service profile (for making changes to the sync db)
94 ProfileSyncService* sync_service_; 122 ProfileSyncService* sync_service_;
95 123
96 DISALLOW_COPY_AND_ASSIGN(TabNodePool); 124 DISALLOW_COPY_AND_ASSIGN(TabNodePool);
97 }; 125 };
98 126
99 } // namespace browser_sync 127 } // namespace browser_sync
100 128
101 #endif // CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_ 129 #endif // CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698