| // 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_base_transaction.h" |
| |
| #include "base/debug/trace_event.h" |
| #include "sync/syncable/directory.h" |
| |
| namespace syncer { |
| namespace syncable { |
| |
| // static |
| Id BaseTransaction::root_id() { |
| return Id(); |
| } |
| |
| Directory* BaseTransaction::directory() const { |
| return directory_; |
| } |
| |
| void BaseTransaction::Lock() { |
| TRACE_EVENT2("sync_lock_contention", "AcquireLock", |
| "src_file", from_here_.file_name(), |
| "src_func", from_here_.function_name()); |
| |
| directory_->kernel_->transaction_mutex.Acquire(); |
| } |
| |
| void BaseTransaction::Unlock() { |
| directory_->kernel_->transaction_mutex.Release(); |
| } |
| |
| void BaseTransaction::OnUnrecoverableError( |
| const tracked_objects::Location& location, |
| const std::string& message) { |
| unrecoverable_error_set_ = true; |
| unrecoverable_error_location_ = location; |
| unrecoverable_error_msg_ = message; |
| |
| // Note: We dont call the Directory's OnUnrecoverableError method right |
| // away. Instead we wait to unwind the stack and in the destructor of the |
| // transaction we would call the OnUnrecoverableError method. |
| |
| directory()->ReportUnrecoverableError(); |
| } |
| |
| bool BaseTransaction::unrecoverable_error_set() const { |
| return unrecoverable_error_set_; |
| } |
| |
| void BaseTransaction::HandleUnrecoverableErrorIfSet() { |
| if (unrecoverable_error_set_) { |
| directory()->OnUnrecoverableError(this, |
| unrecoverable_error_location_, |
| unrecoverable_error_msg_); |
| } |
| } |
| |
| BaseTransaction::BaseTransaction(const tracked_objects::Location& from_here, |
| const char* name, |
| WriterTag writer, |
| Directory* directory) |
| : from_here_(from_here), name_(name), writer_(writer), |
| directory_(directory), unrecoverable_error_set_(false) { |
| // TODO(lipalani): Don't issue a good transaction if the directory has |
| // unrecoverable error set. And the callers have to check trans.good before |
| // proceeding. |
| TRACE_EVENT_BEGIN2("sync", name_, |
| "src_file", from_here_.file_name(), |
| "src_func", from_here_.function_name()); |
| } |
| |
| BaseTransaction::~BaseTransaction() { |
| TRACE_EVENT_END0("sync", name_); |
| } |
| |
| } // namespace syncable |
| } // namespace syncer |