// 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