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