Index: sync/syncable/syncable_write_transaction.cc |
diff --git a/sync/syncable/syncable_write_transaction.cc b/sync/syncable/syncable_write_transaction.cc |
deleted file mode 100644 |
index 08b6aaae966ca3a87706913aa0b7e4bca8005302..0000000000000000000000000000000000000000 |
--- a/sync/syncable/syncable_write_transaction.cc |
+++ /dev/null |
@@ -1,192 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "sync/syncable/syncable_write_transaction.h" |
- |
-#include <stdint.h> |
- |
-#include <string> |
- |
-#include "sync/syncable/directory.h" |
-#include "sync/syncable/directory_change_delegate.h" |
-#include "sync/syncable/mutable_entry.h" |
-#include "sync/syncable/transaction_observer.h" |
-#include "sync/syncable/write_transaction_info.h" |
- |
-namespace syncer { |
-namespace syncable { |
- |
-const int64_t kInvalidTransactionVersion = -1; |
- |
-WriteTransaction::WriteTransaction(const tracked_objects::Location& location, |
- WriterTag writer, Directory* directory) |
- : BaseWriteTransaction(location, "WriteTransaction", writer, directory), |
- transaction_version_(NULL) { |
- Lock(); |
-} |
- |
-WriteTransaction::WriteTransaction(const tracked_objects::Location& location, |
- Directory* directory, |
- int64_t* transaction_version) |
- : BaseWriteTransaction(location, "WriteTransaction", SYNCAPI, directory), |
- transaction_version_(transaction_version) { |
- Lock(); |
- if (transaction_version_) |
- *transaction_version_ = kInvalidTransactionVersion; |
-} |
- |
-void WriteTransaction::TrackChangesTo(const EntryKernel* entry) { |
- if (!entry) { |
- return; |
- } |
- // Insert only if it's not already there. |
- const int64_t handle = entry->ref(META_HANDLE); |
- EntryKernelMutationMap::iterator it = mutations_.lower_bound(handle); |
- if (it == mutations_.end() || it->first != handle) { |
- mutations_[handle].original = *entry; |
- } |
-} |
- |
-ImmutableEntryKernelMutationMap WriteTransaction::RecordMutations() { |
- directory_->kernel()->transaction_mutex.AssertAcquired(); |
- for (syncable::EntryKernelMutationMap::iterator it = mutations_.begin(); |
- it != mutations_.end();) { |
- EntryKernel* kernel = directory()->GetEntryByHandle(it->first); |
- if (!kernel) { |
- NOTREACHED(); |
- continue; |
- } |
- if (kernel->is_dirty()) { |
- it->second.mutated = *kernel; |
- ++it; |
- } else { |
- DCHECK(!it->second.original.is_dirty()); |
- // Not actually mutated, so erase from |mutations_|. |
- mutations_.erase(it++); |
- } |
- } |
- return ImmutableEntryKernelMutationMap(&mutations_); |
-} |
- |
-void WriteTransaction::UnlockAndNotify( |
- const ImmutableEntryKernelMutationMap& mutations) { |
- // Work while transaction mutex is held. |
- ModelTypeSet models_with_changes; |
- bool has_mutations = !mutations.Get().empty(); |
- if (has_mutations) { |
- models_with_changes = NotifyTransactionChangingAndEnding(mutations); |
- } |
- Unlock(); |
- |
- // Work after mutex is relased. |
- if (has_mutations) { |
- NotifyTransactionComplete(models_with_changes); |
- } |
-} |
- |
-ModelTypeSet WriteTransaction::NotifyTransactionChangingAndEnding( |
- const ImmutableEntryKernelMutationMap& mutations) { |
- directory_->kernel()->transaction_mutex.AssertAcquired(); |
- DCHECK(!mutations.Get().empty()); |
- |
- WriteTransactionInfo write_transaction_info( |
- directory_->kernel()->next_write_transaction_id, |
- from_here_, writer_, mutations); |
- ++directory_->kernel()->next_write_transaction_id; |
- |
- ImmutableWriteTransactionInfo immutable_write_transaction_info( |
- &write_transaction_info); |
- DirectoryChangeDelegate* const delegate = directory_->kernel()->delegate; |
- std::vector<int64_t> entry_changed; |
- if (writer_ == syncable::SYNCAPI) { |
- delegate->HandleCalculateChangesChangeEventFromSyncApi( |
- immutable_write_transaction_info, this, &entry_changed); |
- } else { |
- delegate->HandleCalculateChangesChangeEventFromSyncer( |
- immutable_write_transaction_info, this, &entry_changed); |
- } |
- UpdateTransactionVersion(entry_changed); |
- |
- ModelTypeSet models_with_changes = |
- delegate->HandleTransactionEndingChangeEvent( |
- immutable_write_transaction_info, this); |
- |
- directory_->kernel()->transaction_observer.Call(FROM_HERE, |
- &TransactionObserver::OnTransactionWrite, |
- immutable_write_transaction_info, models_with_changes); |
- |
- return models_with_changes; |
-} |
- |
-void WriteTransaction::NotifyTransactionComplete( |
- ModelTypeSet models_with_changes) { |
- directory_->kernel()->delegate->HandleTransactionCompleteChangeEvent( |
- models_with_changes); |
-} |
- |
-void WriteTransaction::UpdateTransactionVersion( |
- const std::vector<int64_t>& entry_changed) { |
- syncer::ModelTypeSet type_seen; |
- for (uint32_t i = 0; i < entry_changed.size(); ++i) { |
- MutableEntry entry(this, GET_BY_HANDLE, entry_changed[i]); |
- if (entry.good()) { |
- ModelType type = GetModelTypeFromSpecifics(entry.GetSpecifics()); |
- if (type < FIRST_REAL_MODEL_TYPE) |
- continue; |
- if (!type_seen.Has(type)) { |
- directory_->IncrementTransactionVersion(type); |
- type_seen.Put(type); |
- } |
- entry.UpdateTransactionVersion(directory_->GetTransactionVersion(type)); |
- } |
- } |
- |
- if (!type_seen.Empty() && transaction_version_) { |
- DCHECK_EQ(1u, type_seen.Size()); |
- *transaction_version_ = directory_->GetTransactionVersion( |
- type_seen.First().Get()); |
- } |
-} |
- |
-WriteTransaction::~WriteTransaction() { |
- const ImmutableEntryKernelMutationMap& mutations = RecordMutations(); |
- |
- MetahandleSet modified_handles; |
- for (EntryKernelMutationMap::const_iterator i = mutations.Get().begin(); |
- i != mutations.Get().end(); ++i) { |
- modified_handles.insert(i->first); |
- } |
- directory()->CheckInvariantsOnTransactionClose(this, modified_handles); |
- |
- // |CheckTreeInvariants| could have thrown an unrecoverable error. |
- if (unrecoverable_error_set_) { |
- HandleUnrecoverableErrorIfSet(); |
- Unlock(); |
- return; |
- } |
- |
- UnlockAndNotify(mutations); |
-} |
- |
-#define ENUM_CASE(x) case x: return #x; break |
- |
-std::string WriterTagToString(WriterTag writer_tag) { |
- switch (writer_tag) { |
- ENUM_CASE(INVALID); |
- ENUM_CASE(SYNCER); |
- ENUM_CASE(AUTHWATCHER); |
- ENUM_CASE(UNITTEST); |
- ENUM_CASE(VACUUM_AFTER_SAVE); |
- ENUM_CASE(HANDLE_SAVE_FAILURE); |
- ENUM_CASE(PURGE_ENTRIES); |
- ENUM_CASE(SYNCAPI); |
- } |
- NOTREACHED(); |
- return std::string(); |
-} |
- |
-#undef ENUM_CASE |
- |
-} // namespace syncable |
-} // namespace syncer |