| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 #if defined(OS_POSIX) | 10 #if defined(OS_POSIX) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include <limits> | 25 #include <limits> |
| 26 #include <set> | 26 #include <set> |
| 27 #include <string> | 27 #include <string> |
| 28 | 28 |
| 29 #include "base/hash_tables.h" | 29 #include "base/hash_tables.h" |
| 30 #include "base/file_util.h" | 30 #include "base/file_util.h" |
| 31 #include "base/logging.h" | 31 #include "base/logging.h" |
| 32 #include "base/perftimer.h" | 32 #include "base/perftimer.h" |
| 33 #include "base/scoped_ptr.h" | 33 #include "base/scoped_ptr.h" |
| 34 #include "base/string_util.h" | 34 #include "base/string_util.h" |
| 35 #include "base/stl_util-inl.h" |
| 35 #include "base/time.h" | 36 #include "base/time.h" |
| 36 #include "chrome/browser/sync/engine/syncer.h" | 37 #include "chrome/browser/sync/engine/syncer.h" |
| 37 #include "chrome/browser/sync/engine/syncer_util.h" | 38 #include "chrome/browser/sync/engine/syncer_util.h" |
| 38 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" | 39 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" |
| 39 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" | 40 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
| 40 #include "chrome/browser/sync/protocol/password_specifics.pb.h" | 41 #include "chrome/browser/sync/protocol/password_specifics.pb.h" |
| 41 #include "chrome/browser/sync/protocol/preference_specifics.pb.h" | 42 #include "chrome/browser/sync/protocol/preference_specifics.pb.h" |
| 42 #include "chrome/browser/sync/protocol/service_constants.h" | 43 #include "chrome/browser/sync/protocol/service_constants.h" |
| 43 #include "chrome/browser/sync/protocol/theme_specifics.pb.h" | 44 #include "chrome/browser/sync/protocol/theme_specifics.pb.h" |
| 44 #include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" | 45 #include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 unsynced_metahandles(new MetahandleSet), | 177 unsynced_metahandles(new MetahandleSet), |
| 177 dirty_metahandles(new MetahandleSet), | 178 dirty_metahandles(new MetahandleSet), |
| 178 metahandles_to_purge(new MetahandleSet), | 179 metahandles_to_purge(new MetahandleSet), |
| 179 channel(new Directory::Channel(syncable::DIRECTORY_DESTROYED)), | 180 channel(new Directory::Channel(syncable::DIRECTORY_DESTROYED)), |
| 180 info_status(Directory::KERNEL_SHARE_INFO_VALID), | 181 info_status(Directory::KERNEL_SHARE_INFO_VALID), |
| 181 persisted_info(info.kernel_info), | 182 persisted_info(info.kernel_info), |
| 182 cache_guid(info.cache_guid), | 183 cache_guid(info.cache_guid), |
| 183 next_metahandle(info.max_metahandle + 1) { | 184 next_metahandle(info.max_metahandle + 1) { |
| 184 } | 185 } |
| 185 | 186 |
| 186 inline void DeleteEntry(EntryKernel* kernel) { | |
| 187 delete kernel; | |
| 188 } | |
| 189 | |
| 190 void Directory::Kernel::AddRef() { | 187 void Directory::Kernel::AddRef() { |
| 191 base::subtle::NoBarrier_AtomicIncrement(&refcount, 1); | 188 base::subtle::NoBarrier_AtomicIncrement(&refcount, 1); |
| 192 } | 189 } |
| 193 | 190 |
| 194 void Directory::Kernel::Release() { | 191 void Directory::Kernel::Release() { |
| 195 if (!base::subtle::NoBarrier_AtomicIncrement(&refcount, -1)) | 192 if (!base::subtle::NoBarrier_AtomicIncrement(&refcount, -1)) |
| 196 delete this; | 193 delete this; |
| 197 } | 194 } |
| 198 | 195 |
| 199 Directory::Kernel::~Kernel() { | 196 Directory::Kernel::~Kernel() { |
| 200 CHECK(0 == refcount); | 197 CHECK(0 == refcount); |
| 201 delete channel; | 198 delete channel; |
| 202 changes_channel.Notify(kShutdownChangesEvent); | 199 changes_channel.Notify(kShutdownChangesEvent); |
| 203 delete unsynced_metahandles; | 200 delete unsynced_metahandles; |
| 204 delete unapplied_update_metahandles; | 201 delete unapplied_update_metahandles; |
| 205 delete dirty_metahandles; | 202 delete dirty_metahandles; |
| 206 delete metahandles_to_purge; | 203 delete metahandles_to_purge; |
| 207 delete parent_id_child_index; | 204 delete parent_id_child_index; |
| 208 delete client_tag_index; | 205 delete client_tag_index; |
| 209 delete ids_index; | 206 delete ids_index; |
| 210 for_each(metahandles_index->begin(), metahandles_index->end(), DeleteEntry); | 207 STLDeleteElements(metahandles_index); |
| 211 delete metahandles_index; | 208 delete metahandles_index; |
| 212 } | 209 } |
| 213 | 210 |
| 214 Directory::Directory() : kernel_(NULL), store_(NULL) { | 211 Directory::Directory() : kernel_(NULL), store_(NULL) { |
| 215 } | 212 } |
| 216 | 213 |
| 217 Directory::~Directory() { | 214 Directory::~Directory() { |
| 218 Close(); | 215 Close(); |
| 219 } | 216 } |
| 220 | 217 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 EntryKernel* Directory::GetEntryByHandle(const int64 metahandle) { | 329 EntryKernel* Directory::GetEntryByHandle(const int64 metahandle) { |
| 333 ScopedKernelLock lock(this); | 330 ScopedKernelLock lock(this); |
| 334 return GetEntryByHandle(metahandle, &lock); | 331 return GetEntryByHandle(metahandle, &lock); |
| 335 } | 332 } |
| 336 | 333 |
| 337 EntryKernel* Directory::GetEntryByHandle(const int64 metahandle, | 334 EntryKernel* Directory::GetEntryByHandle(const int64 metahandle, |
| 338 ScopedKernelLock* lock) { | 335 ScopedKernelLock* lock) { |
| 339 // Look up in memory | 336 // Look up in memory |
| 340 kernel_->needle.put(META_HANDLE, metahandle); | 337 kernel_->needle.put(META_HANDLE, metahandle); |
| 341 MetahandlesIndex::iterator found = | 338 MetahandlesIndex::iterator found = |
| 342 kernel_->metahandles_index->find(&kernel_->needle); | 339 kernel_->metahandles_index->find(&kernel_->needle); |
| 343 if (found != kernel_->metahandles_index->end()) { | 340 if (found != kernel_->metahandles_index->end()) { |
| 344 // Found it in memory. Easy. | 341 // Found it in memory. Easy. |
| 345 return *found; | 342 return *found; |
| 346 } | 343 } |
| 347 return NULL; | 344 return NULL; |
| 348 } | 345 } |
| 349 | 346 |
| 350 // An interface to specify the details of which children | 347 // An interface to specify the details of which children |
| 351 // GetChildHandles() is looking for. | 348 // GetChildHandles() is looking for. |
| 352 // TODO(chron): Clean this up into one function to get child handles | 349 // TODO(chron): Clean this up into one function to get child handles |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 ModelType local_type = GetModelTypeFromSpecifics(local_specifics); | 620 ModelType local_type = GetModelTypeFromSpecifics(local_specifics); |
| 624 ModelType server_type = GetModelTypeFromSpecifics(server_specifics); | 621 ModelType server_type = GetModelTypeFromSpecifics(server_specifics); |
| 625 | 622 |
| 626 // Note the dance around incrementing |it|, since we sometimes erase(). | 623 // Note the dance around incrementing |it|, since we sometimes erase(). |
| 627 if (types.count(local_type) > 0 || types.count(server_type) > 0) { | 624 if (types.count(local_type) > 0 || types.count(server_type) > 0) { |
| 628 UnlinkEntryFromOrder(*it, NULL, &lock); | 625 UnlinkEntryFromOrder(*it, NULL, &lock); |
| 629 int64 handle = (*it)->ref(META_HANDLE); | 626 int64 handle = (*it)->ref(META_HANDLE); |
| 630 kernel_->metahandles_to_purge->insert(handle); | 627 kernel_->metahandles_to_purge->insert(handle); |
| 631 | 628 |
| 632 size_t num_erased = 0; | 629 size_t num_erased = 0; |
| 633 num_erased = kernel_->ids_index->erase(*it); | 630 EntryKernel* entry = *it; |
| 631 num_erased = kernel_->ids_index->erase(entry); |
| 634 DCHECK_EQ(1u, num_erased); | 632 DCHECK_EQ(1u, num_erased); |
| 635 num_erased = kernel_->client_tag_index->erase(*it); | 633 num_erased = kernel_->client_tag_index->erase(entry); |
| 636 DCHECK_EQ((*it)->ref(UNIQUE_CLIENT_TAG).empty(), !num_erased); | 634 DCHECK_EQ(entry->ref(UNIQUE_CLIENT_TAG).empty(), !num_erased); |
| 637 num_erased = kernel_->unsynced_metahandles->erase(handle); | 635 num_erased = kernel_->unsynced_metahandles->erase(handle); |
| 638 DCHECK_EQ((*it)->ref(IS_UNSYNCED), num_erased > 0); | 636 DCHECK_EQ(entry->ref(IS_UNSYNCED), num_erased > 0); |
| 639 num_erased = kernel_->unapplied_update_metahandles->erase(handle); | 637 num_erased = kernel_->unapplied_update_metahandles->erase(handle); |
| 640 DCHECK_EQ((*it)->ref(IS_UNAPPLIED_UPDATE), num_erased > 0); | 638 DCHECK_EQ(entry->ref(IS_UNAPPLIED_UPDATE), num_erased > 0); |
| 641 num_erased = kernel_->parent_id_child_index->erase(*it); | 639 num_erased = kernel_->parent_id_child_index->erase(entry); |
| 642 DCHECK_EQ((*it)->ref(IS_DEL), !num_erased); | 640 DCHECK_EQ(entry->ref(IS_DEL), !num_erased); |
| 643 kernel_->metahandles_index->erase(it++); | 641 kernel_->metahandles_index->erase(it++); |
| 642 delete entry; |
| 644 } else { | 643 } else { |
| 645 ++it; | 644 ++it; |
| 646 } | 645 } |
| 647 } | 646 } |
| 648 | 647 |
| 649 // Ensure meta tracking for these data types reflects the deleted state. | 648 // Ensure meta tracking for these data types reflects the deleted state. |
| 650 for (std::set<ModelType>::const_iterator it = types.begin(); | 649 for (std::set<ModelType>::const_iterator it = types.begin(); |
| 651 it != types.end(); ++it) { | 650 it != types.end(); ++it) { |
| 652 set_initial_sync_ended_for_type_unsafe(*it, false); | 651 set_initial_sync_ended_for_type_unsafe(*it, false); |
| 653 set_last_download_timestamp_unsafe(*it, 0); | 652 set_last_download_timestamp_unsafe(*it, 0); |
| (...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1579 return s << std::dec; | 1578 return s << std::dec; |
| 1580 } | 1579 } |
| 1581 | 1580 |
| 1582 FastDump& operator<<(FastDump& dump, const syncable::Blob& blob) { | 1581 FastDump& operator<<(FastDump& dump, const syncable::Blob& blob) { |
| 1583 if (blob.empty()) | 1582 if (blob.empty()) |
| 1584 return dump; | 1583 return dump; |
| 1585 string buffer(HexEncode(&blob[0], blob.size())); | 1584 string buffer(HexEncode(&blob[0], blob.size())); |
| 1586 dump.out_->sputn(buffer.c_str(), buffer.size()); | 1585 dump.out_->sputn(buffer.c_str(), buffer.size()); |
| 1587 return dump; | 1586 return dump; |
| 1588 } | 1587 } |
| OLD | NEW |