Home | History | Annotate | Download | only in syncable
      1 // Copyright 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "sync/syncable/syncable_base_transaction.h"
      6 
      7 #include "base/debug/trace_event.h"
      8 #include "sync/syncable/directory.h"
      9 
     10 namespace syncer {
     11 namespace syncable {
     12 
     13 // static
     14 Id BaseTransaction::root_id() {
     15   return Id();
     16 }
     17 
     18 Directory* BaseTransaction::directory() const {
     19   return directory_;
     20 }
     21 
     22 void BaseTransaction::Lock() {
     23   TRACE_EVENT2("sync_lock_contention", "AcquireLock",
     24                "src_file", from_here_.file_name(),
     25                "src_func", from_here_.function_name());
     26 
     27   directory_->kernel_->transaction_mutex.Acquire();
     28 }
     29 
     30 void BaseTransaction::Unlock() {
     31   directory_->kernel_->transaction_mutex.Release();
     32 }
     33 
     34 void BaseTransaction::OnUnrecoverableError(
     35     const tracked_objects::Location& location,
     36     const std::string& message) {
     37   unrecoverable_error_set_ = true;
     38   unrecoverable_error_location_ = location;
     39   unrecoverable_error_msg_ = message;
     40 
     41   // Note: We dont call the Directory's OnUnrecoverableError method right
     42   // away. Instead we wait to unwind the stack and in the destructor of the
     43   // transaction we would call the OnUnrecoverableError method.
     44 
     45   directory()->ReportUnrecoverableError();
     46 }
     47 
     48 bool BaseTransaction::unrecoverable_error_set() const {
     49   return unrecoverable_error_set_;
     50 }
     51 
     52 void BaseTransaction::HandleUnrecoverableErrorIfSet() {
     53   if (unrecoverable_error_set_) {
     54     directory()->OnUnrecoverableError(this,
     55         unrecoverable_error_location_,
     56         unrecoverable_error_msg_);
     57   }
     58 }
     59 
     60 BaseTransaction::BaseTransaction(const tracked_objects::Location& from_here,
     61                                  const char* name,
     62                                  WriterTag writer,
     63                                  Directory* directory)
     64     : from_here_(from_here), name_(name), writer_(writer),
     65       directory_(directory), unrecoverable_error_set_(false) {
     66   // TODO(lipalani): Don't issue a good transaction if the directory has
     67   // unrecoverable error set. And the callers have to check trans.good before
     68   // proceeding.
     69   TRACE_EVENT_BEGIN2("sync", name_,
     70                      "src_file", from_here_.file_name(),
     71                      "src_func", from_here_.function_name());
     72 }
     73 
     74 BaseTransaction::~BaseTransaction() {
     75   TRACE_EVENT_END0("sync", name_);
     76 }
     77 
     78 }  // namespace syncable
     79 }  // namespace syncer
     80