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 #include "chrome/browser/visitedlink_master.h" | 5 #include "chrome/browser/visitedlink_master.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <windows.h> | 8 #include <windows.h> |
9 #include <io.h> | 9 #include <io.h> |
10 #include <shlobj.h> | 10 #include <shlobj.h> |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 added_since_rebuild_.insert(fingerprint); | 304 added_since_rebuild_.insert(fingerprint); |
305 } | 305 } |
306 | 306 |
307 // If the table is "full", we don't add URLs and just drop them on the floor. | 307 // If the table is "full", we don't add URLs and just drop them on the floor. |
308 // This can happen if we get thousands of new URLs and something causes | 308 // This can happen if we get thousands of new URLs and something causes |
309 // the table resizing to fail. This check prevents a hang in that case. Note | 309 // the table resizing to fail. This check prevents a hang in that case. Note |
310 // that this is *not* the resize limit, this is just a sanity check. | 310 // that this is *not* the resize limit, this is just a sanity check. |
311 if (used_items_ / 8 > table_length_ / 10) | 311 if (used_items_ / 8 > table_length_ / 10) |
312 return null_hash_; // Table is more than 80% full. | 312 return null_hash_; // Table is more than 80% full. |
313 | 313 |
314 return AddFingerprint(fingerprint); | 314 return AddFingerprint(fingerprint, true); |
315 } | 315 } |
316 | 316 |
317 void VisitedLinkMaster::AddURL(const GURL& url) { | 317 void VisitedLinkMaster::AddURL(const GURL& url) { |
318 Hash index = TryToAddURL(url); | 318 Hash index = TryToAddURL(url); |
319 if (!table_builder_ && index != null_hash_) { | 319 if (!table_builder_ && index != null_hash_) { |
320 // Not rebuilding, so we want to keep the file on disk up-to-date. | 320 // Not rebuilding, so we want to keep the file on disk up-to-date. |
321 WriteUsedItemCountToFile(); | 321 WriteUsedItemCountToFile(); |
322 WriteHashRangeToFile(index, index); | 322 WriteHashRangeToFile(index, index); |
323 ResizeTableIfNecessary(); | 323 ResizeTableIfNecessary(); |
324 } | 324 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 if (!i->is_valid()) | 393 if (!i->is_valid()) |
394 continue; | 394 continue; |
395 deleted_fingerprints.insert( | 395 deleted_fingerprints.insert( |
396 ComputeURLFingerprint(i->spec().data(), i->spec().size(), salt_)); | 396 ComputeURLFingerprint(i->spec().data(), i->spec().size(), salt_)); |
397 } | 397 } |
398 DeleteFingerprintsFromCurrentTable(deleted_fingerprints); | 398 DeleteFingerprintsFromCurrentTable(deleted_fingerprints); |
399 } | 399 } |
400 | 400 |
401 // See VisitedLinkCommon::IsVisited which should be in sync with this algorithm | 401 // See VisitedLinkCommon::IsVisited which should be in sync with this algorithm |
402 VisitedLinkMaster::Hash VisitedLinkMaster::AddFingerprint( | 402 VisitedLinkMaster::Hash VisitedLinkMaster::AddFingerprint( |
403 Fingerprint fingerprint) { | 403 Fingerprint fingerprint, |
| 404 bool send_notifications) { |
404 if (!hash_table_ || table_length_ == 0) { | 405 if (!hash_table_ || table_length_ == 0) { |
405 NOTREACHED(); // Not initialized. | 406 NOTREACHED(); // Not initialized. |
406 return null_hash_; | 407 return null_hash_; |
407 } | 408 } |
408 | 409 |
409 Hash cur_hash = HashFingerprint(fingerprint); | 410 Hash cur_hash = HashFingerprint(fingerprint); |
410 Hash first_hash = cur_hash; | 411 Hash first_hash = cur_hash; |
411 while (true) { | 412 while (true) { |
412 Fingerprint cur_fingerprint = FingerprintAt(cur_hash); | 413 Fingerprint cur_fingerprint = FingerprintAt(cur_hash); |
413 if (cur_fingerprint == fingerprint) | 414 if (cur_fingerprint == fingerprint) |
414 return null_hash_; // This fingerprint is already in there, do nothing. | 415 return null_hash_; // This fingerprint is already in there, do nothing. |
415 | 416 |
416 if (cur_fingerprint == null_fingerprint_) { | 417 if (cur_fingerprint == null_fingerprint_) { |
417 // End of probe sequence found, insert here. | 418 // End of probe sequence found, insert here. |
418 hash_table_[cur_hash] = fingerprint; | 419 hash_table_[cur_hash] = fingerprint; |
419 used_items_++; | 420 used_items_++; |
420 // Notify listener that a new visited link was added. | 421 // If allowed, notify listener that a new visited link was added. |
421 listener_->Add(fingerprint); | 422 if (send_notifications) |
| 423 listener_->Add(fingerprint); |
422 return cur_hash; | 424 return cur_hash; |
423 } | 425 } |
424 | 426 |
425 // Advance in the probe sequence. | 427 // Advance in the probe sequence. |
426 cur_hash = IncrementHash(cur_hash); | 428 cur_hash = IncrementHash(cur_hash); |
427 if (cur_hash == first_hash) { | 429 if (cur_hash == first_hash) { |
428 // This means that we've wrapped around and are about to go into an | 430 // This means that we've wrapped around and are about to go into an |
429 // infinite loop. Something was wrong with the hashtable resizing | 431 // infinite loop. Something was wrong with the hashtable resizing |
430 // logic, so stop here. | 432 // logic, so stop here. |
431 NOTREACHED(); | 433 NOTREACHED(); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 // This will balance the increment of this value in AddFingerprint below | 498 // This will balance the increment of this value in AddFingerprint below |
497 // so there is no net change. | 499 // so there is no net change. |
498 used_items_--; | 500 used_items_--; |
499 } | 501 } |
500 hash_table_[i] = null_fingerprint_; | 502 hash_table_[i] = null_fingerprint_; |
501 } | 503 } |
502 | 504 |
503 if (!shuffled_fingerprints->empty()) { | 505 if (!shuffled_fingerprints->empty()) { |
504 // Need to add the new items back. | 506 // Need to add the new items back. |
505 for (size_t i = 0; i < shuffled_fingerprints->size(); i++) | 507 for (size_t i = 0; i < shuffled_fingerprints->size(); i++) |
506 AddFingerprint(shuffled_fingerprints[i]); | 508 AddFingerprint(shuffled_fingerprints[i], false); |
507 } | 509 } |
508 | 510 |
509 // Write the affected range to disk [deleted_hash, end_range]. | 511 // Write the affected range to disk [deleted_hash, end_range]. |
510 if (update_file) | 512 if (update_file) |
511 WriteHashRangeToFile(deleted_hash, end_range); | 513 WriteHashRangeToFile(deleted_hash, end_range); |
512 | 514 |
513 return true; | 515 return true; |
514 } | 516 } |
515 | 517 |
516 bool VisitedLinkMaster::WriteFullTable() { | 518 bool VisitedLinkMaster::WriteFullTable() { |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 Fingerprint* old_hash_table = hash_table_; | 799 Fingerprint* old_hash_table = hash_table_; |
798 int32 old_table_length = table_length_; | 800 int32 old_table_length = table_length_; |
799 if (!BeginReplaceURLTable(new_size)) | 801 if (!BeginReplaceURLTable(new_size)) |
800 return; | 802 return; |
801 | 803 |
802 // Now we have two tables, our local copy which is the old one, and the new | 804 // Now we have two tables, our local copy which is the old one, and the new |
803 // one loaded into this object where we need to copy the data. | 805 // one loaded into this object where we need to copy the data. |
804 for (int32 i = 0; i < old_table_length; i++) { | 806 for (int32 i = 0; i < old_table_length; i++) { |
805 Fingerprint cur = old_hash_table[i]; | 807 Fingerprint cur = old_hash_table[i]; |
806 if (cur) | 808 if (cur) |
807 AddFingerprint(cur); | 809 AddFingerprint(cur, false); |
808 } | 810 } |
809 | 811 |
810 // On error unmapping, just forget about it since we can't do anything | 812 // On error unmapping, just forget about it since we can't do anything |
811 // else to release it. | 813 // else to release it. |
812 delete old_shared_memory; | 814 delete old_shared_memory; |
813 | 815 |
814 // Send an update notification to all child processes so they read the new | 816 // Send an update notification to all child processes so they read the new |
815 // table. | 817 // table. |
816 listener_->NewTable(shared_memory_); | 818 listener_->NewTable(shared_memory_); |
817 | 819 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
895 base::SharedMemory* old_shared_memory = shared_memory_; | 897 base::SharedMemory* old_shared_memory = shared_memory_; |
896 | 898 |
897 int new_table_size = NewTableSizeForCount( | 899 int new_table_size = NewTableSizeForCount( |
898 static_cast<int>(fingerprints.size())); | 900 static_cast<int>(fingerprints.size())); |
899 if (BeginReplaceURLTable(new_table_size)) { | 901 if (BeginReplaceURLTable(new_table_size)) { |
900 // Free the old table. | 902 // Free the old table. |
901 delete old_shared_memory; | 903 delete old_shared_memory; |
902 | 904 |
903 // Add the stored fingerprints to the hash table. | 905 // Add the stored fingerprints to the hash table. |
904 for (size_t i = 0; i < fingerprints.size(); i++) | 906 for (size_t i = 0; i < fingerprints.size(); i++) |
905 AddFingerprint(fingerprints[i]); | 907 AddFingerprint(fingerprints[i], false); |
906 | 908 |
907 // Also add anything that was added while we were asynchronously | 909 // Also add anything that was added while we were asynchronously |
908 // generating the new table. | 910 // generating the new table. |
909 for (std::set<Fingerprint>::iterator i = added_since_rebuild_.begin(); | 911 for (std::set<Fingerprint>::iterator i = added_since_rebuild_.begin(); |
910 i != added_since_rebuild_.end(); ++i) | 912 i != added_since_rebuild_.end(); ++i) |
911 AddFingerprint(*i); | 913 AddFingerprint(*i, false); |
912 added_since_rebuild_.clear(); | 914 added_since_rebuild_.clear(); |
913 | 915 |
914 // Now handle deletions. | 916 // Now handle deletions. |
915 DeleteFingerprintsFromCurrentTable(deleted_since_rebuild_); | 917 DeleteFingerprintsFromCurrentTable(deleted_since_rebuild_); |
916 deleted_since_rebuild_.clear(); | 918 deleted_since_rebuild_.clear(); |
917 | 919 |
918 // Send an update notification to all child processes. | 920 // Send an update notification to all child processes. |
919 listener_->NewTable(shared_memory_); | 921 listener_->NewTable(shared_memory_); |
920 | 922 |
921 WriteFullTable(); | 923 WriteFullTable(); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 } | 1029 } |
1028 | 1030 |
1029 void VisitedLinkMaster::TableBuilder::OnCompleteMainThread() { | 1031 void VisitedLinkMaster::TableBuilder::OnCompleteMainThread() { |
1030 if (master_) | 1032 if (master_) |
1031 master_->OnTableRebuildComplete(success_, fingerprints_); | 1033 master_->OnTableRebuildComplete(success_, fingerprints_); |
1032 | 1034 |
1033 // WILL (generally) DELETE THIS! This balances the AddRef in | 1035 // WILL (generally) DELETE THIS! This balances the AddRef in |
1034 // VisitedLinkMaster::RebuildTableFromHistory. | 1036 // VisitedLinkMaster::RebuildTableFromHistory. |
1035 Release(); | 1037 Release(); |
1036 } | 1038 } |
OLD | NEW |