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