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

Unified Diff: chrome/browser/visitedlink_master.h

Issue 5606002: Move:... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years 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/visitedlink_event_listener.cc ('k') | chrome/browser/visitedlink_master.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/visitedlink_master.h
===================================================================
--- chrome/browser/visitedlink_master.h (revision 68044)
+++ chrome/browser/visitedlink_master.h (working copy)
@@ -1,388 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_VISITEDLINK_MASTER_H__
-#define CHROME_BROWSER_VISITEDLINK_MASTER_H__
-#pragma once
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-#include <set>
-#include <vector>
-
-#include "base/file_path.h"
-#include "base/gtest_prod_util.h"
-#include "base/ref_counted.h"
-#include "base/shared_memory.h"
-#include "chrome/browser/history/history.h"
-#include "chrome/common/visitedlink_common.h"
-
-class GURL;
-class Profile;
-
-// Controls the link coloring database. The master controls all writing to the
-// database as well as disk I/O. There should be only one master.
-//
-// This class will defer writing operations to the file thread. This means that
-// class destruction, the file may still be open since operations are pending on
-// another thread.
-class VisitedLinkMaster : public VisitedLinkCommon {
- public:
- // Listens to the link coloring database events. The master is given this
- // event as a constructor argument and dispatches events using it.
- class Listener {
- public:
- virtual ~Listener() {}
-
- // Called when link coloring database has been created or replaced. The
- // argument is the new table handle.
- virtual void NewTable(base::SharedMemory*) = 0;
-
- // Called when new link has been added. The argument is the fingerprint
- // (hash) of the link.
- virtual void Add(Fingerprint fingerprint) = 0;
-
- // Called when link coloring state has been reset. This may occur when
- // entire or parts of history were deleted.
- virtual void Reset() = 0;
- };
-
- // The |listener| may not be NULL.
- VisitedLinkMaster(Listener* listener, Profile* profile);
-
- // In unit test mode, we allow the caller to optionally specify the database
- // filename so that it can be run from a unit test. The directory where this
- // file resides must exist in this mode. You can also specify the default
- // table size to test table resizing. If this parameter is 0, we will use the
- // defaults.
- //
- // In the unit test mode, we also allow the caller to provide a history
- // service pointer (the history service can't be fetched from the browser
- // process when we're in unit test mode). This can be NULL to try to access
- // the main version, which will probably fail (which can be good for testing
- // this failure mode).
- //
- // When |suppress_rebuild| is set, we'll not attempt to load data from
- // history if the file can't be loaded. This should generally be set for
- // testing except when you want to test the rebuild process explicitly.
- VisitedLinkMaster(Listener* listener,
- HistoryService* history_service,
- bool suppress_rebuild,
- const FilePath& filename,
- int32 default_table_size);
- virtual ~VisitedLinkMaster();
-
- // Must be called immediately after object creation. Nothing else will work
- // until this is called. Returns true on success, false means that this
- // object won't work.
- bool Init();
-
- base::SharedMemory* shared_memory() { return shared_memory_; }
-
- // Adds a URL to the table.
- void AddURL(const GURL& url);
-
- // Adds a set of URLs to the table.
- void AddURLs(const std::vector<GURL>& url);
-
- // Deletes the specified URLs from the table.
- void DeleteURLs(const std::set<GURL>& urls);
-
- // Clears the visited links table by deleting the file from disk. Used as
- // part of history clearing.
- void DeleteAllURLs();
-
-#if defined(UNIT_TEST) || !defined(NDEBUG) || defined(PERF_TEST)
- // This is a debugging function that can be called to double-check internal
- // data structures. It will assert if the check fails.
- void DebugValidate();
-
- // Sets a task to execute when the next rebuild from history is complete.
- // This is used by unit tests to wait for the rebuild to complete before
- // they continue. The pointer will be owned by this object after the call.
- void set_rebuild_complete_task(Task* task) {
- DCHECK(!rebuild_complete_task_.get());
- rebuild_complete_task_.reset(task);
- }
-
- // returns the number of items in the table for testing verification
- int32 GetUsedCount() const {
- return used_items_;
- }
-
- // Call to cause the entire database file to be re-written from scratch
- // to disk. Used by the performance tester.
- bool RewriteFile() {
- return WriteFullTable();
- }
-#endif
-
- private:
- FRIEND_TEST_ALL_PREFIXES(VisitedLinkTest, Delete);
- FRIEND_TEST_ALL_PREFIXES(VisitedLinkTest, BigDelete);
- FRIEND_TEST_ALL_PREFIXES(VisitedLinkTest, BigImport);
-
- // Object to rebuild the table on the history thread (see the .cc file).
- class TableBuilder;
-
- // Byte offsets of values in the header.
- static const int32 kFileHeaderSignatureOffset;
- static const int32 kFileHeaderVersionOffset;
- static const int32 kFileHeaderLengthOffset;
- static const int32 kFileHeaderUsedOffset;
- static const int32 kFileHeaderSaltOffset;
-
- // The signature at the beginning of a file.
- static const int32 kFileSignature;
-
- // version of the file format this module currently uses
- static const int32 kFileCurrentVersion;
-
- // Bytes in the file header, including the salt.
- static const size_t kFileHeaderSize;
-
- // When creating a fresh new table, we use this many entries.
- static const unsigned kDefaultTableSize;
-
- // When the user is deleting a boatload of URLs, we don't really want to do
- // individual writes for each of them. When the count exceeds this threshold,
- // we will write the whole table to disk at once instead of individual items.
- static const size_t kBigDeleteThreshold;
-
- // Backend for the constructors initializing the members.
- void InitMembers(Listener* listener, Profile* profile);
-
- // If a rebuild is in progress, we save the URL in the temporary list.
- // Otherwise, we add this to the table. Returns the index of the
- // inserted fingerprint or null_hash_ on failure.
- Hash TryToAddURL(const GURL& url);
-
- // File I/O functions
- // ------------------
-
- // Writes the entire table to disk, returning true on success. It will leave
- // the table file open and the handle to it in file_
- bool WriteFullTable();
-
- // Try to load the table from the database file. If the file doesn't exist or
- // is corrupt, this will return failure.
- bool InitFromFile();
-
- // 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.
- //
- // 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]);
-
- // Fills *filename with the name of the link database filename
- bool GetDatabaseFileName(FilePath* filename);
-
- // Wrapper around Window's WriteFile using asynchronous I/O. This will proxy
- // the write to a background thread.
- void WriteToFile(FILE* hfile, off_t offset, void* data, int32 data_size);
-
- // Helper function to schedule and asynchronous write of the used count to
- // disk (this is a common operation).
- void WriteUsedItemCountToFile();
-
- // Helper function to schedule an asynchronous write of the given range of
- // hash functions to disk. The range is inclusive on both ends. The range can
- // 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);
-
- // General table handling
- // ----------------------
-
- // Called to add a fingerprint to the table. If |send_notifications| is true
- // and the item is added successfully, Listener::Add will be invoked.
- // Returns the index of the inserted fingerprint or null_hash_ if there was a
- // duplicate and this item was skippped.
- Hash AddFingerprint(Fingerprint fingerprint, bool send_notifications);
-
- // Deletes all fingerprints from the given vector from the current hash table
- // and syncs it to disk if there are changes. This does not update the
- // deleted_since_rebuild_ list, the caller must update this itself if there
- // is an update pending.
- void DeleteFingerprintsFromCurrentTable(
- const std::set<Fingerprint>& fingerprints);
-
- // Removes the indicated fingerprint from the table. If the update_file flag
- // is set, the changes will also be written to disk. Returns true if the
- // fingerprint was deleted, false if it was not in the table to delete.
- bool DeleteFingerprint(Fingerprint fingerprint, bool update_file);
-
- // Creates a new empty table, call if InitFromFile() fails. Normally, when
- // |suppress_rebuild| is false, the table will be rebuilt from history,
- // keeping us in sync. When |suppress_rebuild| is true, the new table will be
- // empty and we will not consult history. This is used when clearing the
- // 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);
-
- // A wrapper for CreateURLTable, this will allocate a new table, initialized
- // to empty. The caller is responsible for saving the shared memory pointer
- // and handles before this call (they will be replaced with new ones) and
- // releasing them later. This is designed for callers that make a new table
- // and then copy values from the old table to the new one, then release the
- // old table.
- //
- // Returns true on success. On failure, the old table will be restored. The
- // caller should not attemp to release the pointer/handle in this case.
- bool BeginReplaceURLTable(int32 num_entries);
-
- // unallocates the Fingerprint table
- void FreeURLTable();
-
- // For growing the table. ResizeTableIfNecessary will check to see if the
- // table should be resized and calls ResizeTable if needed. Returns true if
- // we decided to resize the table.
- bool ResizeTableIfNecessary();
-
- // Resizes the table (growing or shrinking) as necessary to accomodate the
- // current count.
- void ResizeTable(int32 new_size);
-
- // Returns the desired table size for |item_count| URLs.
- uint32 NewTableSizeForCount(int32 item_count) const;
-
- // Computes the table load as fraction. For example, if 1/4 of the entries are
- // full, this value will be 0.25
- float ComputeTableLoad() const {
- return static_cast<float>(used_items_) / static_cast<float>(table_length_);
- }
-
- // Initializes a rebuild of the visited link database based on the browser
- // history. This will set table_builder_ while working, and there should not
- // already be a rebuild in place when called. See the definition for more
- // details on how this works.
- //
- // Returns true on success. Failure means we're not attempting to rebuild
- // the database because something failed.
- bool RebuildTableFromHistory();
-
- // Callback that the table rebuilder uses when the rebuild is complete.
- // |success| is true if the fingerprint generation succeeded, in which case
- // |fingerprints| will contain the computed fingerprints. On failure, there
- // will be no fingerprints.
- void OnTableRebuildComplete(bool success,
- const std::vector<Fingerprint>& fingerprints);
-
- // Increases or decreases the given hash value by one, wrapping around as
- // necessary. Used for probing.
- inline Hash IncrementHash(Hash hash) {
- if (hash >= table_length_ - 1)
- return 0; // Wrap around.
- return hash + 1;
- }
- inline Hash DecrementHash(Hash hash) {
- if (hash <= 0)
- return table_length_ - 1; // Wrap around.
- return hash - 1;
- }
-
- Listener* listener_;
-
-#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 user profile that this object belongs to
- // (it knows the path to where the data is stored)
- Profile* profile_;
-
- // When non-NULL, indicates we are in database rebuild mode and points to
- // the class collecting fingerprint information from the history system.
- // The pointer is owned by this class, but it must remain valid while the
- // 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_;
-
- // 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. Writing to the file may
- // be safely ignored in this case.
- FILE* file_;
-
- // Shared memory consists of a SharedHeader followed by the table.
- base::SharedMemory *shared_memory_;
-
- // When we generate new tables, we increment the serial number of the
- // shared memory object.
- int32 shared_memory_serial_;
-
- // Number of non-empty items in the table, used to compute fullness.
- int32 used_items_;
-
- // Testing values -----------------------------------------------------------
- //
- // The following fields exist for testing purposes. They are not used in
- // release builds. It'd be nice to eliminate them in release builds, but we
- // don't want to change the signature of the object between the unit test and
- // regular builds. Instead, we just have "default" values that these take
- // in release builds that give "regular" behavior.
-
- // Overridden database file name for testing
- FilePath database_name_override_;
-
- // When nonzero, overrides the table size for new databases for testing
- int32 table_size_override_;
-
- // When non-NULL, overrides the history service to use rather than as the
- // BrowserProcess. This is provided for unit tests.
- HistoryService* history_service_override_;
-
- // When non-NULL, indicates the task that should be run after the next
- // rebuild from history is complete.
- scoped_ptr<Task> rebuild_complete_task_;
-
- // Set to prevent us from attempting to rebuild the database from global
- // history if we have an error opening the file. This is used for testing,
- // will be false in production.
- bool suppress_rebuild_;
-
- DISALLOW_COPY_AND_ASSIGN(VisitedLinkMaster);
-};
-
-// NOTE: These methods are defined inline here, so we can share the compilation
-// of visitedlink_master.cc between the browser and the unit/perf tests.
-
-#if defined(UNIT_TEST) || defined(PERF_TEST) || !defined(NDEBUG)
-inline void VisitedLinkMaster::DebugValidate() {
- int32 used_count = 0;
- for (int32 i = 0; i < table_length_; i++) {
- if (hash_table_[i])
- used_count++;
- }
- DCHECK_EQ(used_count, used_items_);
-}
-#endif
-
-#endif // CHROME_BROWSER_VISITEDLINK_MASTER_H__
« no previous file with comments | « chrome/browser/visitedlink_event_listener.cc ('k') | chrome/browser/visitedlink_master.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698