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

Side by Side Diff: chrome/browser/visitedlink_master.cc

Issue 113591: Fix Acid3 Test 48: LINKTEST, Chromium side.... (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: Made waiting more bearable. Created 11 years, 5 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/visitedlink_master.h ('k') | chrome/browser/visitedlink_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 // The thread the visited link master is on where we will notify it. 192 // The thread the visited link master is on where we will notify it.
193 MessageLoop* main_message_loop_; 193 MessageLoop* main_message_loop_;
194 194
195 // Indicates whether the operation has failed or not. 195 // Indicates whether the operation has failed or not.
196 bool success_; 196 bool success_;
197 197
198 // Salt for this new table. 198 // Salt for this new table.
199 uint8 salt_[LINK_SALT_LENGTH]; 199 uint8 salt_[LINK_SALT_LENGTH];
200 200
201 // Stores the fingerprints we computed on the background thread. 201 // Stores the fingerprints we computed on the background thread.
202 std::vector<VisitedLinkMaster::Fingerprint> fingerprints_; 202 VisitedLinkCommon::Fingerprints fingerprints_;
203 }; 203 };
204 204
205 // VisitedLinkMaster ---------------------------------------------------------- 205 // VisitedLinkMaster ----------------------------------------------------------
206 206
207 VisitedLinkMaster::VisitedLinkMaster(base::Thread* file_thread, 207 VisitedLinkMaster::VisitedLinkMaster(base::Thread* file_thread,
208 PostNewTableEvent* poster, 208 Listener* listener,
209 Profile* profile) { 209 Profile* profile) {
210 InitMembers(file_thread, poster, profile); 210 InitMembers(file_thread, listener, profile);
211 } 211 }
212 212
213 VisitedLinkMaster::VisitedLinkMaster(base::Thread* file_thread, 213 VisitedLinkMaster::VisitedLinkMaster(base::Thread* file_thread,
214 PostNewTableEvent* poster, 214 Listener* listener,
215 HistoryService* history_service, 215 HistoryService* history_service,
216 bool suppress_rebuild, 216 bool suppress_rebuild,
217 const FilePath& filename, 217 const FilePath& filename,
218 int32 default_table_size) { 218 int32 default_table_size) {
219 InitMembers(file_thread, poster, NULL); 219 InitMembers(file_thread, listener, NULL);
220 220
221 database_name_override_ = filename; 221 database_name_override_ = filename;
222 table_size_override_ = default_table_size; 222 table_size_override_ = default_table_size;
223 history_service_override_ = history_service; 223 history_service_override_ = history_service;
224 suppress_rebuild_ = suppress_rebuild; 224 suppress_rebuild_ = suppress_rebuild;
225 } 225 }
226 226
227 VisitedLinkMaster::~VisitedLinkMaster() { 227 VisitedLinkMaster::~VisitedLinkMaster() {
228 if (table_builder_.get()) { 228 if (table_builder_.get()) {
229 // Prevent the table builder from calling us back now that we're being 229 // Prevent the table builder from calling us back now that we're being
230 // destroyed. Note that we DON'T delete the object, since the history 230 // destroyed. Note that we DON'T delete the object, since the history
231 // system is still writing into it. When that is complete, the table 231 // system is still writing into it. When that is complete, the table
232 // builder will destroy itself when it finds we are gone. 232 // builder will destroy itself when it finds we are gone.
233 table_builder_->DisownMaster(); 233 table_builder_->DisownMaster();
234 } 234 }
235 FreeURLTable(); 235 FreeURLTable();
236 } 236 }
237 237
238 void VisitedLinkMaster::InitMembers(base::Thread* file_thread, 238 void VisitedLinkMaster::InitMembers(base::Thread* file_thread,
239 PostNewTableEvent* poster, 239 Listener* listener,
240 Profile* profile) { 240 Profile* profile) {
241 DCHECK(listener);
242
241 if (file_thread) 243 if (file_thread)
242 file_thread_ = file_thread->message_loop(); 244 file_thread_ = file_thread->message_loop();
243 else 245 else
244 file_thread_ = NULL; 246 file_thread_ = NULL;
245 247
246 post_new_table_event_ = poster; 248 listener_ = listener;
247 file_ = NULL; 249 file_ = NULL;
248 shared_memory_ = NULL; 250 shared_memory_ = NULL;
249 shared_memory_serial_ = 0; 251 shared_memory_serial_ = 0;
250 used_items_ = 0; 252 used_items_ = 0;
251 table_size_override_ = 0; 253 table_size_override_ = 0;
252 history_service_override_ = NULL; 254 history_service_override_ = NULL;
253 suppress_rebuild_ = false; 255 suppress_rebuild_ = false;
254 profile_ = profile; 256 profile_ = profile;
255 257
256 #ifndef NDEBUG 258 #ifndef NDEBUG
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 deleted_since_rebuild_.clear(); 343 deleted_since_rebuild_.clear();
342 344
343 // Clear the hash table. 345 // Clear the hash table.
344 used_items_ = 0; 346 used_items_ = 0;
345 memset(hash_table_, 0, this->table_length_ * sizeof(Fingerprint)); 347 memset(hash_table_, 0, this->table_length_ * sizeof(Fingerprint));
346 348
347 // Resize it if it is now too empty. Resize may write the new table out for 349 // Resize it if it is now too empty. Resize may write the new table out for
348 // us, otherwise, schedule writing the new table to disk ourselves. 350 // us, otherwise, schedule writing the new table to disk ourselves.
349 if (!ResizeTableIfNecessary()) 351 if (!ResizeTableIfNecessary())
350 WriteFullTable(); 352 WriteFullTable();
353
354 listener_->Reset();
351 } 355 }
352 356
353 void VisitedLinkMaster::DeleteURLs(const std::set<GURL>& urls) { 357 void VisitedLinkMaster::DeleteURLs(const std::set<GURL>& urls) {
354 typedef std::set<GURL>::const_iterator SetIterator; 358 typedef std::set<GURL>::const_iterator SetIterator;
355 359
356 if (urls.empty()) 360 if (urls.empty())
357 return; 361 return;
358 362
363 listener_->Reset();
364
359 if (table_builder_) { 365 if (table_builder_) {
360 // A rebuild is in progress, save this deletion in the temporary list so 366 // A rebuild is in progress, save this deletion in the temporary list so
361 // it can be added once rebuild is complete. 367 // it can be added once rebuild is complete.
362 for (SetIterator i = urls.begin(); i != urls.end(); ++i) { 368 for (SetIterator i = urls.begin(); i != urls.end(); ++i) {
363 if (!i->is_valid()) 369 if (!i->is_valid())
364 continue; 370 continue;
365 371
366 Fingerprint fingerprint = 372 Fingerprint fingerprint =
367 ComputeURLFingerprint(i->spec().data(), i->spec().size(), salt_); 373 ComputeURLFingerprint(i->spec().data(), i->spec().size(), salt_);
368 deleted_since_rebuild_.insert(fingerprint); 374 deleted_since_rebuild_.insert(fingerprint);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 Hash first_hash = cur_hash; 410 Hash first_hash = cur_hash;
405 while (true) { 411 while (true) {
406 Fingerprint cur_fingerprint = FingerprintAt(cur_hash); 412 Fingerprint cur_fingerprint = FingerprintAt(cur_hash);
407 if (cur_fingerprint == fingerprint) 413 if (cur_fingerprint == fingerprint)
408 return null_hash_; // This fingerprint is already in there, do nothing. 414 return null_hash_; // This fingerprint is already in there, do nothing.
409 415
410 if (cur_fingerprint == null_fingerprint_) { 416 if (cur_fingerprint == null_fingerprint_) {
411 // End of probe sequence found, insert here. 417 // End of probe sequence found, insert here.
412 hash_table_[cur_hash] = fingerprint; 418 hash_table_[cur_hash] = fingerprint;
413 used_items_++; 419 used_items_++;
420 // Notify listener that a new visited link was added.
421 listener_->Add(fingerprint);
414 return cur_hash; 422 return cur_hash;
415 } 423 }
416 424
417 // Advance in the probe sequence. 425 // Advance in the probe sequence.
418 cur_hash = IncrementHash(cur_hash); 426 cur_hash = IncrementHash(cur_hash);
419 if (cur_hash == first_hash) { 427 if (cur_hash == first_hash) {
420 // This means that we've wrapped around and are about to go into an 428 // This means that we've wrapped around and are about to go into an
421 // infinite loop. Something was wrong with the hashtable resizing 429 // infinite loop. Something was wrong with the hashtable resizing
422 // logic, so stop here. 430 // logic, so stop here.
423 NOTREACHED(); 431 NOTREACHED();
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 if (cur) 806 if (cur)
799 AddFingerprint(cur); 807 AddFingerprint(cur);
800 } 808 }
801 809
802 // On error unmapping, just forget about it since we can't do anything 810 // On error unmapping, just forget about it since we can't do anything
803 // else to release it. 811 // else to release it.
804 delete old_shared_memory; 812 delete old_shared_memory;
805 813
806 // Send an update notification to all child processes so they read the new 814 // Send an update notification to all child processes so they read the new
807 // table. 815 // table.
808 post_new_table_event_(shared_memory_); 816 listener_->NewTable(shared_memory_);
809 817
810 #ifndef NDEBUG 818 #ifndef NDEBUG
811 DebugValidate(); 819 DebugValidate();
812 #endif 820 #endif
813 821
814 // The new table needs to be written to disk. 822 // The new table needs to be written to disk.
815 WriteFullTable(); 823 WriteFullTable();
816 } 824 }
817 825
818 uint32 VisitedLinkMaster::NewTableSizeForCount(int32 item_count) const { 826 uint32 VisitedLinkMaster::NewTableSizeForCount(int32 item_count) const {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 for (std::set<Fingerprint>::iterator i = added_since_rebuild_.begin(); 909 for (std::set<Fingerprint>::iterator i = added_since_rebuild_.begin();
902 i != added_since_rebuild_.end(); ++i) 910 i != added_since_rebuild_.end(); ++i)
903 AddFingerprint(*i); 911 AddFingerprint(*i);
904 added_since_rebuild_.clear(); 912 added_since_rebuild_.clear();
905 913
906 // Now handle deletions. 914 // Now handle deletions.
907 DeleteFingerprintsFromCurrentTable(deleted_since_rebuild_); 915 DeleteFingerprintsFromCurrentTable(deleted_since_rebuild_);
908 deleted_since_rebuild_.clear(); 916 deleted_since_rebuild_.clear();
909 917
910 // Send an update notification to all child processes. 918 // Send an update notification to all child processes.
911 post_new_table_event_(shared_memory_); 919 listener_->NewTable(shared_memory_);
912 920
913 WriteFullTable(); 921 WriteFullTable();
914 } 922 }
915 } 923 }
916 table_builder_ = NULL; // Will release our reference to the builder. 924 table_builder_ = NULL; // Will release our reference to the builder.
917 925
918 // Notify the unit test that the rebuild is complete (will be NULL in prod.) 926 // Notify the unit test that the rebuild is complete (will be NULL in prod.)
919 if (rebuild_complete_task_.get()) { 927 if (rebuild_complete_task_.get()) {
920 rebuild_complete_task_->Run(); 928 rebuild_complete_task_->Run();
921 rebuild_complete_task_.reset(NULL); 929 rebuild_complete_task_.reset(NULL);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 } 1027 }
1020 1028
1021 void VisitedLinkMaster::TableBuilder::OnCompleteMainThread() { 1029 void VisitedLinkMaster::TableBuilder::OnCompleteMainThread() {
1022 if (master_) 1030 if (master_)
1023 master_->OnTableRebuildComplete(success_, fingerprints_); 1031 master_->OnTableRebuildComplete(success_, fingerprints_);
1024 1032
1025 // WILL (generally) DELETE THIS! This balances the AddRef in 1033 // WILL (generally) DELETE THIS! This balances the AddRef in
1026 // VisitedLinkMaster::RebuildTableFromHistory. 1034 // VisitedLinkMaster::RebuildTableFromHistory.
1027 Release(); 1035 Release();
1028 } 1036 }
OLDNEW
« no previous file with comments | « chrome/browser/visitedlink_master.h ('k') | chrome/browser/visitedlink_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698