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

Unified Diff: components/visitedlink/browser/visitedlink_master.h

Issue 1417943002: Load the table of visited links from database file asynchronously. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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
Index: components/visitedlink/browser/visitedlink_master.h
diff --git a/components/visitedlink/browser/visitedlink_master.h b/components/visitedlink/browser/visitedlink_master.h
index d154c8067c72163720e85f834d1e240e5c7017a9..a0ca775ecc4167a3dfa5335339c1d0debe36e7d8 100644
--- a/components/visitedlink/browser/visitedlink_master.h
+++ b/components/visitedlink/browser/visitedlink_master.h
@@ -15,7 +15,9 @@
#include "base/callback_forward.h"
#include "base/files/file_path.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/shared_memory.h"
+#include "base/memory/weak_ptr.h"
#include "base/threading/sequenced_worker_pool.h"
#include "components/visitedlink/common/visitedlink_common.h"
@@ -160,6 +162,13 @@ class VisitedLinkMaster : public VisitedLinkCommon {
FRIEND_TEST_ALL_PREFIXES(VisitedLinkTest, BigDelete);
FRIEND_TEST_ALL_PREFIXES(VisitedLinkTest, BigImport);
+ // Keeps the result of loading a table from a database file to the UI thread.
+ struct LoadFromFileResult;
+
+ using TableLoadCompleteCallback = base::Callback<void(
+ bool success,
+ scoped_refptr<LoadFromFileResult> load_from_file_result)>;
+
// Object to rebuild the table on the history thread (see the .cc file).
class TableBuilder;
@@ -207,19 +216,39 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// the handle to it will be stored in file_.
void WriteFullTable();
- // Try to load the table from the database file. If the file doesn't exist or
- // is corrupt, this will return failure.
+ // Tries to load asynchronously the table from the database file.
bool InitFromFile();
+ // Load the table from the database file. Calls |callback| when completed. It
+ // is called from the background thread. It must be first in the sequence of
+ // background operations with the database file.
+ static void LoadFromFile(const base::FilePath& filename,
+ const TableLoadCompleteCallback& callback);
+
+ // Load the table from the database file. Returns true on success.
+ // Fills parameter |load_from_file_result| on success. It is called from
+ // the background thread.
+ static bool LoadApartFromFile(
+ const base::FilePath& filename,
+ scoped_refptr<LoadFromFileResult>* load_from_file_result);
+
+ // It is called from the background thread and executed on the UI
+ // thread.
+ void OnTableLoadComplete(
+ bool success,
+ scoped_refptr<LoadFromFileResult> load_from_file_result);
+
// Reads the header of the link coloring database from disk. Assumes the
- // file pointer is at the beginning of the file and that there are no pending
- // asynchronous I/O operations.
+ // file pointer is at the beginning of the file and that it is the first
+ // asynchronous I/O operation on the background thread.
//
// Returns true on success and places the size of the table in num_entries
// and the number of nonzero fingerprints in used_count. This will fail if
// the version of the file is not the current version of the database.
- bool ReadFileHeader(FILE* hfile, int32* num_entries, int32* used_count,
- uint8 salt[LINK_SALT_LENGTH]);
+ static bool ReadFileHeader(FILE* hfile,
+ int32* num_entries,
+ int32* used_count,
+ uint8 salt[LINK_SALT_LENGTH]);
// Fills *filename with the name of the link database filename
bool GetDatabaseFileName(base::FilePath* filename);
@@ -237,9 +266,13 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// wrap around at 0 and this function will handle it.
void WriteHashRangeToFile(Hash first_hash, Hash last_hash);
- // Synchronous read from the file. Assumes there are no pending asynchronous
- // I/O functions. Returns true if the entire buffer was successfully filled.
- bool ReadFromFile(FILE* hfile, off_t offset, void* data, size_t data_size);
+ // Synchronous read from the file. Assumes that it is the first asynchronous
+ // I/O operation in the background thread. Returns true if the entire buffer
+ // was successfully filled.
+ static bool ReadFromFile(FILE* hfile,
+ off_t offset,
+ void* data,
+ size_t data_size);
// General table handling
// ----------------------
@@ -269,12 +302,16 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// database and for unit tests.
bool InitFromScratch(bool suppress_rebuild);
- // Allocates the Fingerprint structure and length. When init_to_empty is set,
- // the table will be filled with 0s and used_items_ will be set to 0 as well.
- // If the flag is not set, these things are untouched and it is the
- // responsibility of the caller to fill them (like when we are reading from
- // a file).
- bool CreateURLTable(int32 num_entries, bool init_to_empty);
+ // Allocates the Fingerprint structure and length. Structure is filled with 0s
+ // and shared header with salt and used_items_ is set to 0.
+ bool CreateURLTable(int32 num_entries);
+
+ // Allocates the Fingerprint structure and length. Returns true on success.
+ // Structure is filled with 0s and shared header with salt.
+ static bool CreateApartURLTable(int32 num_entries,
+ const uint8 salt[LINK_SALT_LENGTH],
+ scoped_ptr<base::SharedMemory>* shared_memory,
+ VisitedLinkCommon::Fingerprint** hash_table);
// A wrapper for CreateURLTable, this will allocate a new table, initialized
// to empty. The caller is responsible for saving the shared memory pointer
@@ -299,6 +336,9 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// current count.
void ResizeTable(int32 new_size);
+ // Returns the default table size. It can be overrided in unit tests.
+ uint32 DefaultTableSize() const;
+
// Returns the desired table size for |item_count| URLs.
uint32 NewTableSizeForCount(int32 item_count) const;
@@ -337,15 +377,6 @@ class VisitedLinkMaster : public VisitedLinkCommon {
return hash - 1;
}
-#ifndef NDEBUG
- // Indicates whether any asynchronous operation has ever been completed.
- // We do some synchronous reads that require that no asynchronous operations
- // are pending, yet we don't track whether they have been completed. This
- // flag is a sanity check that these reads only happen before any
- // asynchronous writes have been fired.
- bool posted_asynchronous_operation_;
-#endif
-
// Reference to the browser context that this object belongs to
// (it knows the path to where the data is stored)
content::BrowserContext* browser_context_;
@@ -366,14 +397,10 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// history query is running. We must only delete it when the query is done.
scoped_refptr<TableBuilder> table_builder_;
- // Indicates URLs added and deleted since we started rebuilding the table.
- std::set<Fingerprint> added_since_rebuild_;
- std::set<Fingerprint> deleted_since_rebuild_;
-
- // TODO(brettw) Support deletion, we need to track whether anything was
- // deleted during the rebuild here. Then we should delete any of these
- // entries from the complete table later.
- // std::vector<Fingerprint> removed_since_rebuild_;
+ // Indicates URLs added and deleted since we started rebuilding or loading the
+ // table.
+ std::set<Fingerprint> added_since_rebuild_or_load_;
+ std::set<Fingerprint> deleted_since_rebuild_or_load_;
// The currently open file with the table in it. This may be NULL if we're
// rebuilding and haven't written a new version yet or if |persist_to_disk_|
@@ -400,6 +427,9 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// Number of non-empty items in the table, used to compute fullness.
int32 used_items_;
+ // We set this to true to avoid writing to the database file.
+ bool table_is_loading_from_file_;
+
// Testing values -----------------------------------------------------------
//
// The following fields exist for testing purposes. They are not used in
@@ -423,6 +453,8 @@ class VisitedLinkMaster : public VisitedLinkCommon {
// will be false in production.
bool suppress_rebuild_;
+ base::WeakPtrFactory<VisitedLinkMaster> weak_ptr_factory_;
+
DISALLOW_COPY_AND_ASSIGN(VisitedLinkMaster);
};

Powered by Google App Engine
This is Rietveld 408576698