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

Side by Side Diff: chrome/browser/sync/syncable/syncable.cc

Issue 8565035: sync: don't notify from ~BaseTransaction if the writer is INVALID. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/sync/syncable/syncable.h" 5 #include "chrome/browser/sync/syncable/syncable.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 #include <functional> 9 #include <functional>
10 #include <iomanip> 10 #include <iomanip>
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 708
709 // Handle success or failure. 709 // Handle success or failure.
710 if (success) 710 if (success)
711 VacuumAfterSaveChanges(snapshot); 711 VacuumAfterSaveChanges(snapshot);
712 else 712 else
713 HandleSaveChangesFailure(snapshot); 713 HandleSaveChangesFailure(snapshot);
714 return success; 714 return success;
715 } 715 }
716 716
717 void Directory::VacuumAfterSaveChanges(const SaveChangesSnapshot& snapshot) { 717 void Directory::VacuumAfterSaveChanges(const SaveChangesSnapshot& snapshot) {
718 if (snapshot.dirty_metas.empty())
719 return;
720
718 // Need a write transaction as we are about to permanently purge entries. 721 // Need a write transaction as we are about to permanently purge entries.
719 WriteTransaction trans(FROM_HERE, VACUUM_AFTER_SAVE, this); 722 WriteTransaction trans(FROM_HERE, VACUUM_AFTER_SAVE, this);
720 ScopedKernelLock lock(this); 723 ScopedKernelLock lock(this);
721 kernel_->flushed_metahandles.Push(0); // Begin flush marker
722 // Now drop everything we can out of memory. 724 // Now drop everything we can out of memory.
723 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin(); 725 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
724 i != snapshot.dirty_metas.end(); ++i) { 726 i != snapshot.dirty_metas.end(); ++i) {
725 kernel_->needle.put(META_HANDLE, i->ref(META_HANDLE)); 727 kernel_->needle.put(META_HANDLE, i->ref(META_HANDLE));
726 MetahandlesIndex::iterator found = 728 MetahandlesIndex::iterator found =
727 kernel_->metahandles_index->find(&kernel_->needle); 729 kernel_->metahandles_index->find(&kernel_->needle);
728 EntryKernel* entry = (found == kernel_->metahandles_index->end() ? 730 EntryKernel* entry = (found == kernel_->metahandles_index->end() ?
729 NULL : *found); 731 NULL : *found);
730 if (entry && SafeToPurgeFromMemory(entry)) { 732 if (entry && SafeToPurgeFromMemory(entry)) {
731 // We now drop deleted metahandles that are up to date on both the client 733 // We now drop deleted metahandles that are up to date on both the client
732 // and the server. 734 // and the server.
733 size_t num_erased = 0; 735 size_t num_erased = 0;
734 int64 handle = entry->ref(META_HANDLE);
735 kernel_->flushed_metahandles.Push(handle);
736 num_erased = kernel_->ids_index->erase(entry); 736 num_erased = kernel_->ids_index->erase(entry);
737 DCHECK_EQ(1u, num_erased); 737 DCHECK_EQ(1u, num_erased);
738 num_erased = kernel_->metahandles_index->erase(entry); 738 num_erased = kernel_->metahandles_index->erase(entry);
739 DCHECK_EQ(1u, num_erased); 739 DCHECK_EQ(1u, num_erased);
740 740
741 // Might not be in it 741 // Might not be in it
742 num_erased = kernel_->client_tag_index->erase(entry); 742 num_erased = kernel_->client_tag_index->erase(entry);
743 DCHECK_EQ(entry->ref(UNIQUE_CLIENT_TAG).empty(), !num_erased); 743 DCHECK_EQ(entry->ref(UNIQUE_CLIENT_TAG).empty(), !num_erased);
744 CHECK(!kernel_->parent_id_child_index->count(entry)); 744 CHECK(!kernel_->parent_id_child_index->count(entry));
745 delete entry; 745 delete entry;
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
1151 const char* name, 1151 const char* name,
1152 WriterTag writer, 1152 WriterTag writer,
1153 Directory* directory) 1153 Directory* directory)
1154 : from_here_(from_here), name_(name), writer_(writer), 1154 : from_here_(from_here), name_(name), writer_(writer),
1155 directory_(directory), dirkernel_(directory->kernel_) { 1155 directory_(directory), dirkernel_(directory->kernel_) {
1156 dirkernel_->observers->Notify( 1156 dirkernel_->observers->Notify(
1157 &TransactionObserver::OnTransactionStart, from_here_, writer_); 1157 &TransactionObserver::OnTransactionStart, from_here_, writer_);
1158 } 1158 }
1159 1159
1160 BaseTransaction::~BaseTransaction() { 1160 BaseTransaction::~BaseTransaction() {
1161 dirkernel_->observers->Notify( 1161 if (writer_ != INVALID) {
rlarocque 2011/11/15 01:08:56 What would happen if we removed this code altogeth
rlarocque 2011/11/15 01:23:06 Never mind, I see how it's used now. We use some
1162 &TransactionObserver::OnTransactionEnd, from_here_, writer_); 1162 dirkernel_->observers->Notify(
1163 &TransactionObserver::OnTransactionEnd, from_here_, writer_);
1164 }
1163 } 1165 }
1164 1166
1165 ReadTransaction::ReadTransaction(const tracked_objects::Location& location, 1167 ReadTransaction::ReadTransaction(const tracked_objects::Location& location,
1166 Directory* directory) 1168 Directory* directory)
1167 : BaseTransaction(location, "Read", INVALID, directory) { 1169 : BaseTransaction(location, "Read", INVALID, directory) {
1168 Lock(); 1170 Lock();
1169 } 1171 }
1170 1172
1171 ReadTransaction::ReadTransaction(const tracked_objects::Location& location, 1173 ReadTransaction::ReadTransaction(const tracked_objects::Location& location,
1172 const ScopedDirLookup& scoped_dir) 1174 const ScopedDirLookup& scoped_dir)
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
2019 if (entry->ref(NEXT_ID).IsRoot() || 2021 if (entry->ref(NEXT_ID).IsRoot() ||
2020 entry->ref(NEXT_ID) != entry->ref(PREV_ID)) { 2022 entry->ref(NEXT_ID) != entry->ref(PREV_ID)) {
2021 return entry; 2023 return entry;
2022 } 2024 }
2023 } 2025 }
2024 // There were no children in the linked list. 2026 // There were no children in the linked list.
2025 return NULL; 2027 return NULL;
2026 } 2028 }
2027 2029
2028 } // namespace syncable 2030 } // namespace syncable
OLDNEW
« chrome/browser/sync/syncable/syncable.h ('K') | « chrome/browser/sync/syncable/syncable.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698