| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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_VISITEDLINK_MASTER_H__ | 5 #ifndef CHROME_BROWSER_VISITEDLINK_MASTER_H__ |
| 6 #define CHROME_BROWSER_VISITEDLINK_MASTER_H__ | 6 #define CHROME_BROWSER_VISITEDLINK_MASTER_H__ |
| 7 | 7 |
| 8 #if defined(OS_WIN) | 8 #if defined(OS_WIN) |
| 9 #include <windows.h> | 9 #include <windows.h> |
| 10 #endif | 10 #endif |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 } // namespace base | 28 } // namespace base |
| 29 | 29 |
| 30 // Controls the link coloring database. The master controls all writing to the | 30 // Controls the link coloring database. The master controls all writing to the |
| 31 // database as well as disk I/O. There should be only one master. | 31 // database as well as disk I/O. There should be only one master. |
| 32 // | 32 // |
| 33 // This class will optionally defer writing operations to another thread. This | 33 // This class will optionally defer writing operations to another thread. This |
| 34 // means that after class destruction, the file may still be open since | 34 // means that after class destruction, the file may still be open since |
| 35 // operations are pending on another thread. | 35 // operations are pending on another thread. |
| 36 class VisitedLinkMaster : public VisitedLinkCommon { | 36 class VisitedLinkMaster : public VisitedLinkCommon { |
| 37 public: | 37 public: |
| 38 typedef void (PostNewTableEvent)(base::SharedMemory*); | 38 // Listens to the link coloring database events. The master is given this |
| 39 // event as a constructor argument and dispatches events using it. |
| 40 class Listener { |
| 41 public: |
| 42 virtual ~Listener() {} |
| 43 |
| 44 // Called when link coloring database has been created or replaced. The |
| 45 // argument is the new table handle. |
| 46 virtual void NewTable(base::SharedMemory*) = 0; |
| 47 |
| 48 // Called when new link has been added. The argument is the fingerprint |
| 49 // (hash) of the link. |
| 50 virtual void Add(Fingerprint fingerprint) = 0; |
| 51 |
| 52 // Called when link coloring state has been reset. This may occur when |
| 53 // entire or parts of history were deleted. |
| 54 virtual void Reset() = 0; |
| 55 }; |
| 39 | 56 |
| 40 // The |file_thread| may be NULL, in which case write operations will be | 57 // The |file_thread| may be NULL, in which case write operations will be |
| 41 // synchronous. | 58 // synchronous. |
| 59 // The |listener| may not be NULL. |
| 42 VisitedLinkMaster(base::Thread* file_thread, | 60 VisitedLinkMaster(base::Thread* file_thread, |
| 43 PostNewTableEvent* poster, | 61 Listener* listener, |
| 44 Profile* profile); | 62 Profile* profile); |
| 45 | 63 |
| 46 // In unit test mode, we allow the caller to optionally specify the database | 64 // In unit test mode, we allow the caller to optionally specify the database |
| 47 // filename so that it can be run from a unit test. The directory where this | 65 // filename so that it can be run from a unit test. The directory where this |
| 48 // file resides must exist in this mode. You can also specify the default | 66 // file resides must exist in this mode. You can also specify the default |
| 49 // table size to test table resizing. If this parameter is 0, we will use the | 67 // table size to test table resizing. If this parameter is 0, we will use the |
| 50 // defaults. | 68 // defaults. |
| 51 // | 69 // |
| 52 // In the unit test mode, we also allow the caller to provide a history | 70 // In the unit test mode, we also allow the caller to provide a history |
| 53 // service pointer (the history service can't be fetched from the browser | 71 // service pointer (the history service can't be fetched from the browser |
| 54 // process when we're in unit test mode). This can be NULL to try to access | 72 // process when we're in unit test mode). This can be NULL to try to access |
| 55 // the main version, which will probably fail (which can be good for testing | 73 // the main version, which will probably fail (which can be good for testing |
| 56 // this failure mode). | 74 // this failure mode). |
| 57 // | 75 // |
| 58 // When |suppress_rebuild| is set, we'll not attempt to load data from | 76 // When |suppress_rebuild| is set, we'll not attempt to load data from |
| 59 // history if the file can't be loaded. This should generally be set for | 77 // history if the file can't be loaded. This should generally be set for |
| 60 // testing except when you want to test the rebuild process explicitly. | 78 // testing except when you want to test the rebuild process explicitly. |
| 61 VisitedLinkMaster(base::Thread* file_thread, | 79 VisitedLinkMaster(base::Thread* file_thread, |
| 62 PostNewTableEvent* poster, | 80 Listener* listener, |
| 63 HistoryService* history_service, | 81 HistoryService* history_service, |
| 64 bool suppress_rebuild, | 82 bool suppress_rebuild, |
| 65 const FilePath& filename, | 83 const FilePath& filename, |
| 66 int32 default_table_size); | 84 int32 default_table_size); |
| 67 virtual ~VisitedLinkMaster(); | 85 virtual ~VisitedLinkMaster(); |
| 68 | 86 |
| 69 // Must be called immediately after object creation. Nothing else will work | 87 // Must be called immediately after object creation. Nothing else will work |
| 70 // until this is called. Returns true on success, false means that this | 88 // until this is called. Returns true on success, false means that this |
| 71 // object won't work. | 89 // object won't work. |
| 72 bool Init(); | 90 bool Init(); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 // When creating a fresh new table, we use this many entries. | 161 // When creating a fresh new table, we use this many entries. |
| 144 static const unsigned kDefaultTableSize; | 162 static const unsigned kDefaultTableSize; |
| 145 | 163 |
| 146 // When the user is deleting a boatload of URLs, we don't really want to do | 164 // When the user is deleting a boatload of URLs, we don't really want to do |
| 147 // individual writes for each of them. When the count exceeds this threshold, | 165 // individual writes for each of them. When the count exceeds this threshold, |
| 148 // we will write the whole table to disk at once instead of individual items. | 166 // we will write the whole table to disk at once instead of individual items. |
| 149 static const size_t kBigDeleteThreshold; | 167 static const size_t kBigDeleteThreshold; |
| 150 | 168 |
| 151 // Backend for the constructors initializing the members. | 169 // Backend for the constructors initializing the members. |
| 152 void InitMembers(base::Thread* file_thread, | 170 void InitMembers(base::Thread* file_thread, |
| 153 PostNewTableEvent* poster, | 171 Listener* listener, |
| 154 Profile* profile); | 172 Profile* profile); |
| 155 | 173 |
| 156 // If a rebuild is in progress, we save the URL in the temporary list. | 174 // If a rebuild is in progress, we save the URL in the temporary list. |
| 157 // Otherwise, we add this to the table. Returns the index of the | 175 // Otherwise, we add this to the table. Returns the index of the |
| 158 // inserted fingerprint or null_hash_ on failure. | 176 // inserted fingerprint or null_hash_ on failure. |
| 159 Hash TryToAddURL(const GURL& url); | 177 Hash TryToAddURL(const GURL& url); |
| 160 | 178 |
| 161 // File I/O functions | 179 // File I/O functions |
| 162 // ------------------ | 180 // ------------------ |
| 163 | 181 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 if (hash >= table_length_ - 1) | 305 if (hash >= table_length_ - 1) |
| 288 return 0; // Wrap around. | 306 return 0; // Wrap around. |
| 289 return hash + 1; | 307 return hash + 1; |
| 290 } | 308 } |
| 291 inline Hash DecrementHash(Hash hash) { | 309 inline Hash DecrementHash(Hash hash) { |
| 292 if (hash <= 0) | 310 if (hash <= 0) |
| 293 return table_length_ - 1; // Wrap around. | 311 return table_length_ - 1; // Wrap around. |
| 294 return hash - 1; | 312 return hash - 1; |
| 295 } | 313 } |
| 296 | 314 |
| 297 PostNewTableEvent* post_new_table_event_; | 315 Listener* listener_; |
| 298 | 316 |
| 299 #ifndef NDEBUG | 317 #ifndef NDEBUG |
| 300 // Indicates whether any asynchronous operation has ever been completed. | 318 // Indicates whether any asynchronous operation has ever been completed. |
| 301 // We do some synchronous reads that require that no asynchronous operations | 319 // We do some synchronous reads that require that no asynchronous operations |
| 302 // are pending, yet we don't track whether they have been completed. This | 320 // are pending, yet we don't track whether they have been completed. This |
| 303 // flag is a sanity check that these reads only happen before any | 321 // flag is a sanity check that these reads only happen before any |
| 304 // asynchronous writes have been fired. | 322 // asynchronous writes have been fired. |
| 305 bool posted_asynchronous_operation_; | 323 bool posted_asynchronous_operation_; |
| 306 #endif | 324 #endif |
| 307 | 325 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 int32 used_count = 0; | 399 int32 used_count = 0; |
| 382 for (int32 i = 0; i < table_length_; i++) { | 400 for (int32 i = 0; i < table_length_; i++) { |
| 383 if (hash_table_[i]) | 401 if (hash_table_[i]) |
| 384 used_count++; | 402 used_count++; |
| 385 } | 403 } |
| 386 DCHECK_EQ(used_count, used_items_); | 404 DCHECK_EQ(used_count, used_items_); |
| 387 } | 405 } |
| 388 #endif | 406 #endif |
| 389 | 407 |
| 390 #endif // CHROME_BROWSER_VISITEDLINK_MASTER_H__ | 408 #endif // CHROME_BROWSER_VISITEDLINK_MASTER_H__ |
| OLD | NEW |