| // 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/trace_event/trace_event.h" | 
 | #include "sync/syncable/directory.h" | 
 |  | 
 | namespace syncer { | 
 | namespace syncable { | 
 |  | 
 | // static | 
 | Id BaseTransaction::root_id() { | 
 |   return Id::GetRoot(); | 
 | } | 
 |  | 
 | 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 |