blob: bc546ff88f2662dfe15554d34a153e84b0abc0ac [file] [log] [blame]
// Copyright 2013 The Flutter 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 "impeller/archivist/archive_transaction.h"
#include "flutter/fml/logging.h"
#include "impeller/archivist/archive_statement.h"
namespace impeller {
ArchiveTransaction::ArchiveTransaction(int64_t& transactionCount,
ArchiveStatement& beginStatement,
ArchiveStatement& endStatement,
ArchiveStatement& rollbackStatement)
: end_stmt_(endStatement),
rollback_stmt_(rollbackStatement),
transaction_count_(transactionCount) {
if (transaction_count_ == 0) {
cleanup_ = beginStatement.Execute() == ArchiveStatement::Result::kDone;
}
transaction_count_++;
}
ArchiveTransaction::ArchiveTransaction(ArchiveTransaction&& other)
: end_stmt_(other.end_stmt_),
rollback_stmt_(other.rollback_stmt_),
transaction_count_(other.transaction_count_),
cleanup_(other.cleanup_),
successful_(other.successful_) {
other.abandoned_ = true;
}
ArchiveTransaction::~ArchiveTransaction() {
if (abandoned_) {
return;
}
FML_CHECK(transaction_count_ != 0);
if (transaction_count_ == 1 && cleanup_) {
auto res = successful_ ? end_stmt_.Execute() : rollback_stmt_.Execute();
FML_CHECK(res == ArchiveStatement::Result::kDone)
<< "Must be able to commit the nested transaction";
}
transaction_count_--;
}
void ArchiveTransaction::MarkWritesAsReadyForCommit() {
successful_ = true;
}
} // namespace impeller