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
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_
6 #define CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_
12 #include "base/basictypes.h"
13 #include "base/gtest_prod_util.h"
14 #include "chrome/browser/sessions/session_id.h"
16 class ProfileSyncService
;
18 namespace browser_sync
{
20 // A pool for managing free/used tab sync nodes for the *local* session.
21 // Performs lazy creation of sync nodes when necessary.
22 // Note: We make use of the following "id's"
23 // - a tab_id: created by session service, unique to this client
24 // - a tab_node_id: the id for a particular sync tab node. This is used
25 // to generate the sync tab node tag through:
26 // tab_tag = StringPrintf("%s_%ui", local_session_tag, tab_node_id);
28 // A sync node can be in one of the three states:
29 // 1. Associated : Sync node is used and associated with a tab.
30 // 2. Unassociated : Sync node is used but currently unassociated with any tab.
31 // This is true for old nodes that remain from a session
32 // restart. Nodes are only unassociated temporarily while the
33 // model associator figures out which tabs belong to which
34 // nodes. Eventually any remaining unassociated nodes are
36 // 3. Free : Sync node is unused.
40 explicit TabNodePool(ProfileSyncService
* sync_service
);
46 // If free nodes > kFreeNodesHighWatermark, delete all free nodes until
47 // free nodes <= kFreeNodesLowWatermark.
48 static const size_t kFreeNodesLowWatermark
;
50 // Maximum limit of FreeNodes allowed on the client.
51 static const size_t kFreeNodesHighWatermark
;
53 static const int kInvalidTabNodeID
;
55 // Build a sync tag from tab_node_id.
56 static std::string
TabIdToTag(const std::string machine_tag
,
59 // Returns the tab_node_id for the next free tab node. If none are available,
60 // creates a new tab node and adds it to free nodes pool. The free node can
61 // then be used to associate with a tab by calling AssociateTabNode.
62 // Note: The node is considered free until it has been associated. Repeated
63 // calls to GetFreeTabNode will return the same id until node has been
67 // Removes association for |tab_node_id| and returns it to the free node pool.
68 void FreeTabNode(int tab_node_id
);
70 // Associates |tab_node_id| with |tab_id|. |tab_node_id| should either be
71 // unassociated or free. If |tab_node_id| is free, |tab_node_id| is removed
72 // from the free node pool In order to associate a non free sync node,
73 // use ReassociateTabNode.
74 void AssociateTabNode(int tab_node_id
, SessionID::id_type tab_id
);
76 // Adds |tab_node_id| as an unassociated sync node.
77 // Note: this should only be called when we discover tab sync nodes from
78 // previous sessions, not for freeing tab nodes we created through
79 // GetFreeTabNode (use FreeTabNode below for that).
80 void AddTabNode(int tab_node_id
);
82 // Returns the tab_id for |tab_node_id| if it is associated else returns
84 SessionID::id_type
GetTabIdFromTabNodeId(int tab_node_id
) const;
86 // Reassociates |tab_node_id| with |tab_id|. |tab_node_id| must be either
87 // associated with a tab or in the set of unassociated nodes.
88 void ReassociateTabNode(int tab_node_id
, SessionID::id_type tab_id
);
90 // Returns true if |tab_node_id| is an unassociated tab node.
91 bool IsUnassociatedTabNode(int tab_node_id
);
93 // Deletes any unassociated nodes.
94 void DeleteUnassociatedTabNodes();
99 // Return the number of tab nodes this client currently has allocated
100 // (including both free, unassociated and associated nodes)
101 size_t Capacity() const;
103 // Return empty status (all tab nodes are in use).
106 // Return full status (no tab nodes are in use).
109 void SetMachineTag(const std::string
& machine_tag
);
112 friend class SyncTabNodePoolTest
;
113 typedef std::map
<int, SessionID::id_type
> TabNodeIDToTabIDMap
;
115 // Adds |tab_node_id| to free node pool.
116 void FreeTabNodeInternal(int tab_node_id
);
118 // Stores mapping of node ids associated with tab_ids, these are the used
119 // nodes of tab node pool.
120 // The nodes in the map can be returned to free tab node pool by calling
121 // FreeTabNode(tab_node_id).
122 TabNodeIDToTabIDMap nodeid_tabid_map_
;
124 // The node ids for the set of free sync nodes.
125 std::set
<int> free_nodes_pool_
;
127 // The node ids that are added to pool using AddTabNode and are currently
128 // not associated with any tab. They can be reassociated using
129 // ReassociateTabNode.
130 std::set
<int> unassociated_nodes_
;
132 // The maximum used tab_node id for a sync node. A new sync node will always
133 // be created with max_used_tab_node_id_ + 1.
134 int max_used_tab_node_id_
;
136 // The machine tag associated with this tab pool. Used in the title of new
138 std::string machine_tag_
;
140 // Our sync service profile (for making changes to the sync db)
141 ProfileSyncService
* sync_service_
;
143 DISALLOW_COPY_AND_ASSIGN(TabNodePool
);
146 } // namespace browser_sync
148 #endif // CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_