Index: components/sync/syncable/directory.cc |
diff --git a/components/sync/syncable/directory.cc b/components/sync/syncable/directory.cc |
index 90491f0f78f7d84ca57a2ffdc549928b4e259a69..e0413ff66704e64f8f6125eea4eda1a84e951103 100644 |
--- a/components/sync/syncable/directory.cc |
+++ b/components/sync/syncable/directory.cc |
@@ -13,6 +13,7 @@ |
#include "base/base64.h" |
#include "base/guid.h" |
+#include "base/memory/ptr_util.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/stl_util.h" |
#include "base/strings/string_number_conversions.h" |
@@ -102,10 +103,7 @@ Directory::Kernel::Kernel( |
DCHECK(transaction_observer.IsInitialized()); |
} |
-Directory::Kernel::~Kernel() { |
- base::STLDeleteContainerPairSecondPointers(metahandles_map.begin(), |
- metahandles_map.end()); |
-} |
+Directory::Kernel::~Kernel() {} |
Directory::Directory( |
DirectoryBackingStore* store, |
@@ -143,9 +141,9 @@ DirOpenResult Directory::Open( |
void Directory::InitializeIndices(MetahandlesMap* handles_map) { |
ScopedKernelLock lock(this); |
kernel_->metahandles_map.swap(*handles_map); |
- for (MetahandlesMap::const_iterator it = kernel_->metahandles_map.begin(); |
+ for (auto it = kernel_->metahandles_map.begin(); |
it != kernel_->metahandles_map.end(); ++it) { |
- EntryKernel* entry = it->second; |
+ EntryKernel* entry = it->second.get(); |
if (ParentChildIndex::ShouldInclude(entry)) |
kernel_->parent_child_index.Insert(entry); |
const int64_t metahandle = entry->ref(META_HANDLE); |
@@ -185,10 +183,6 @@ DirOpenResult Directory::OpenImpl( |
// swap these later. |
Directory::MetahandlesMap tmp_handles_map; |
- // Avoids mem leaks on failure. Harmlessly deletes the empty hash map after |
- // the swap in the success case. |
- base::STLValueDeleter<MetahandlesMap> deleter(&tmp_handles_map); |
- |
JournalIndex delete_journals; |
MetahandleSet metahandles_to_purge; |
@@ -287,7 +281,7 @@ EntryKernel* Directory::GetEntryByHandle(const ScopedKernelLock& lock, |
MetahandlesMap::iterator found = kernel_->metahandles_map.find(metahandle); |
if (found != kernel_->metahandles_map.end()) { |
// Found it in memory. Easy. |
- return found->second; |
+ return found->second.get(); |
} |
return NULL; |
} |
@@ -367,7 +361,8 @@ bool Directory::InsertEntry(const ScopedKernelLock& lock, |
static const char error[] = "Entry already in memory index."; |
if (!SyncAssert(kernel_->metahandles_map |
- .insert(std::make_pair(entry->ref(META_HANDLE), entry)) |
+ .insert(std::make_pair(entry->ref(META_HANDLE), |
+ base::WrapUnique(entry))) |
.second, |
FROM_HERE, error, trans)) { |
return false; |
@@ -599,10 +594,12 @@ bool Directory::VacuumAfterSaveChanges(const SaveChangesSnapshot& snapshot) { |
MetahandlesMap::iterator found = |
kernel_->metahandles_map.find((*i)->ref(META_HANDLE)); |
EntryKernel* entry = |
- (found == kernel_->metahandles_map.end() ? NULL : found->second); |
+ (found == kernel_->metahandles_map.end() ? NULL : found->second.get()); |
if (entry && SafeToPurgeFromMemory(&trans, entry)) { |
// We now drop deleted metahandles that are up to date on both the client |
// and the server. |
+ std::unique_ptr<EntryKernel> unique_entry = std::move(found->second); |
+ |
size_t num_erased = 0; |
num_erased = kernel_->metahandles_map.erase(entry->ref(META_HANDLE)); |
DCHECK_EQ(1u, num_erased); |
@@ -623,8 +620,6 @@ bool Directory::VacuumAfterSaveChanges(const SaveChangesSnapshot& snapshot) { |
return false; |
RemoveFromAttachmentIndex(lock, entry->ref(META_HANDLE), |
entry->ref(ATTACHMENT_METADATA)); |
- |
- delete entry; |
} |
if (trans.unrecoverable_error_set()) |
return false; |
@@ -698,8 +693,11 @@ void Directory::DeleteEntry(const ScopedKernelLock& lock, |
kernel_->metahandles_to_purge.insert(handle); |
+ std::unique_ptr<EntryKernel> entry_ptr = |
+ std::move(kernel_->metahandles_map[handle]); |
+ |
size_t num_erased = 0; |
- num_erased = kernel_->metahandles_map.erase(entry->ref(META_HANDLE)); |
+ num_erased = kernel_->metahandles_map.erase(handle); |
DCHECK_EQ(1u, num_erased); |
num_erased = kernel_->ids_map.erase(entry->ref(ID).value()); |
DCHECK_EQ(1u, num_erased); |
@@ -721,9 +719,7 @@ void Directory::DeleteEntry(const ScopedKernelLock& lock, |
RemoveFromAttachmentIndex(lock, handle, entry->ref(ATTACHMENT_METADATA)); |
if (save_to_journal) { |
- entries_to_journal->insert(entry); |
- } else { |
- delete entry; |
+ entries_to_journal->insert(entry_ptr.release()); |
} |
} |
@@ -759,7 +755,7 @@ bool Directory::PurgeEntriesWithTypeIn(ModelTypeSet disabled_types, |
for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin(); |
it != kernel_->metahandles_map.end();) { |
- EntryKernel* entry = it->second; |
+ EntryKernel* entry = it->second.get(); |
const sync_pb::EntitySpecifics& local_specifics = entry->ref(SPECIFICS); |
const sync_pb::EntitySpecifics& server_specifics = |
entry->ref(SERVER_SPECIFICS); |
@@ -1088,7 +1084,7 @@ void Directory::GetMetaHandlesOfType(const ScopedKernelLock& lock, |
result->clear(); |
for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin(); |
it != kernel_->metahandles_map.end(); ++it) { |
- EntryKernel* entry = it->second; |
+ EntryKernel* entry = it->second.get(); |
const ModelType entry_type = |
GetModelTypeFromSpecifics(entry->ref(SPECIFICS)); |
if (entry_type == type) |
@@ -1104,7 +1100,7 @@ void Directory::CollectMetaHandleCounts( |
for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin(); |
it != kernel_->metahandles_map.end(); ++it) { |
- EntryKernel* entry = it->second; |
+ EntryKernel* entry = it->second.get(); |
const ModelType type = GetModelTypeFromSpecifics(entry->ref(SPECIFICS)); |
(*num_entries_by_type)[type]++; |
if (entry->ref(IS_DEL)) |
@@ -1124,7 +1120,7 @@ std::unique_ptr<base::ListValue> Directory::GetNodeDetailsForType( |
continue; |
} |
- EntryKernel* kernel = it->second; |
+ EntryKernel* kernel = it->second.get(); |
std::unique_ptr<base::DictionaryValue> node( |
kernel->ToValue(GetCryptographer(trans))); |