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

Unified 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: nit. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/sync/glue/synced_tab_delegate_android.cc ('k') | chrome/browser/sync/glue/tab_node_pool.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/sync/glue/tab_node_pool.h
diff --git a/chrome/browser/sync/glue/tab_node_pool.h b/chrome/browser/sync/glue/tab_node_pool.h
index 8327d061e08551ecf4fb835e39b06b80f1a613f5..4ad3fefd7fb63b162f486f3d29af379e86aaeb9a 100644
--- a/chrome/browser/sync/glue/tab_node_pool.h
+++ b/chrome/browser/sync/glue/tab_node_pool.h
@@ -5,10 +5,13 @@
#ifndef CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_
#define CHROME_BROWSER_SYNC_GLUE_TAB_NODE_POOL_H_
+#include <map>
+#include <set>
#include <string>
-#include <vector>
#include "base/basictypes.h"
+#include "base/gtest_prod_util.h"
+#include "chrome/browser/sessions/session_id.h"
class ProfileSyncService;
@@ -16,77 +19,97 @@ namespace browser_sync {
// A pool for managing free/used tab sync nodes. Performs lazy creation
// of sync nodes when necessary.
+// Note: We make use of the following "id's"
+// - a sync_id: an int64 used in |syncer::InitByIdLookup|
+// - a tab_id: created by session service, unique to this client
+// - a tab_node_id: the id for a particular sync tab node. This is used
+// to generate the sync tab node tag through:
+// tab_tag = StringPrintf("%s_%ui", local_session_tag, tab_node_id);
+// tab_node_id and sync_id are both unique to a particular sync node. The
+// difference is that tab_node_id is controlled by the model associator and
+// is used when creating a new sync node, which returns the sync_id, created
+// by the sync db.
class TabNodePool {
public:
explicit TabNodePool(ProfileSyncService* sync_service);
~TabNodePool();
-
+ enum InvalidTab {
+ kInvalidTabID = -1
+ };
// Build a sync tag from tab_node_id.
static std::string TabIdToTag(const std::string machine_tag,
size_t tab_node_id);
- // Add a previously allocated tab sync node to our pool. Increases the size
- // of tab_syncid_pool_ by one and marks the new tab node as free.
+ // Returns the sync_id for the next free tab node. If none are available,
+ // creates a new tab node and adds it to free nodes pool. The free node can
+ // then be used to associate with a tab by calling AssociateTabNode.
+ // Note: The node is considered free until it has been associated. Repeated
+ // calls to GetFreeTabNode will return the same sync_id until node has been
+ // associated.
+ int64 GetFreeTabNode();
+
+ // Removes the node from |syncid_tabid_map_| and returns the node to free
+ // pool.
+ void FreeTabNode(int64 sync_id);
+
+ // Removes |sync_id| from free node pool and associates it with |tab_id|.
+ // sync_id should be id of a free node. In order to associate a non free
+ // sync node, use ReassociateTabNode.
+ void AssociateTabNode(int64 sync_id, SessionID::id_type tab_id);
+
+ // Associate sync_id with tab_id but does not add it to free node pool.
// Note: this should only be called when we discover tab sync nodes from
// previous sessions, not for freeing tab nodes we created through
// GetFreeTabNode (use FreeTabNode below for that).
- void AddTabNode(int64 sync_id);
+ // The difference between AddTabNode and AssociateTabNode is that
+ // AssociateTabNode requires the sync node to be free to be associated.
+ // AddTabNode just adds the association.
+ void AddTabNode(int64 sync_id, const SessionID& tab_id, size_t tab_node_id);
- // Returns the sync_id for the next free tab node. If none are available,
- // creates a new tab node.
- // Note: We make use of the following "id's"
- // - a sync_id: an int64 used in |syncer::InitByIdLookup|
- // - a tab_id: created by session service, unique to this client
- // - a tab_node_id: the id for a particular sync tab node. This is used
- // to generate the sync tab node tag through:
- // tab_tag = StringPrintf("%s_%ui", local_session_tag, tab_node_id);
- // tab_node_id and sync_id are both unique to a particular sync node. The
- // difference is that tab_node_id is controlled by the model associator and
- // is used when creating a new sync node, which returns the sync_id, created
- // by the sync db.
- int64 GetFreeTabNode();
+ // Returns the tab_id for |sync_id| if it exists else returns kInvalidTabID.
+ SessionID::id_type GetTabIdFromSyncId(int64 sync_id) const;
- // Return a tab node to our free pool.
- // Note: the difference between FreeTabNode and AddTabNode is that
- // FreeTabNode does not modify the size of |tab_syncid_pool_|, while
- // AddTabNode increases it by one. In the case of FreeTabNode, the size of
- // the |tab_syncid_pool_| should always be equal to the amount of tab nodes
- // associated with this machine.
- void FreeTabNode(int64 sync_id);
+ // Reassociates sync node with id |sync_id| with tab node with |tab_id|.
+ // Returns true if it is able to reassociate the node, false if a sync node
+ // with id |sync_id| is not associated with any tab.
+ bool ReassociateTabNode(int64 sync_id, SessionID::id_type tab_id);
+
+ // Returns any nodes with sync_ids not in |used_synced_ids| to free node pool.
+ void FreeUnusedTabNodes(const std::set<int64>& used_sync_ids);
// Clear tab pool.
- void clear() {
- tab_syncid_pool_.clear();
- tab_pool_fp_ = -1;
- }
+ void Clear();
// Return the number of tab nodes this client currently has allocated
// (including both free and used nodes)
- size_t capacity() const { return tab_syncid_pool_.size(); }
+ size_t Capacity() const;
// Return empty status (all tab nodes are in use).
- bool empty() const { return tab_pool_fp_ == -1; }
+ bool Empty() const;
// Return full status (no tab nodes are in use).
- bool full() {
- return tab_pool_fp_ == static_cast<int64>(tab_syncid_pool_.size())-1;
- }
+ bool Full();
- void set_machine_tag(const std::string& machine_tag) {
- machine_tag_ = machine_tag;
- }
+ void SetMachineTag(const std::string& machine_tag);
private:
- // Pool of all available syncid's for tab's we have created.
- std::vector<int64> tab_syncid_pool_;
+ friend class SyncTabNodePoolTest;
+ typedef std::map<int64, SessionID::id_type> SyncIDToTabIDMap;
+
+ // Stores mapping of sync_ids associated with tab_ids, these are the used
+ // nodes of tab node pool.
+ // The nodes in the map can be returned to free tab node pool by calling
+ // FreeTabNode(sync_id).
+ SyncIDToTabIDMap syncid_tabid_map_;
+
+ // The sync ids for the set of free sync nodes.
+ std::set<int64> free_nodes_pool_;
- // Free pointer for tab pool. Only those node id's, up to and including the
- // one indexed by the free pointer, are valid and free. The rest of the
- // |tab_syncid_pool_| is invalid because the nodes are in use.
- // To get the next free node, use tab_syncid_pool_[tab_pool_fp_--].
- int64 tab_pool_fp_;
+ // The maximum used tab_node id for a sync node. A new sync node will always
+ // be created with max_used_tab_node_id_ + 1.
+ size_t max_used_tab_node_id_;
- // The machiine tag associated with this tab pool. Used in the title of new
+ // The machine tag associated with this tab pool. Used in the title of new
// sync nodes.
std::string machine_tag_;
« no previous file with comments | « chrome/browser/sync/glue/synced_tab_delegate_android.cc ('k') | chrome/browser/sync/glue/tab_node_pool.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698