1d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz/*
2d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * Copyright (C) 2014 The Android Open Source Project
3d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz *
4d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * Licensed under the Apache License, Version 2.0 (the "License");
5d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * you may not use this file except in compliance with the License.
6d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * You may obtain a copy of the License at
7d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz *
8d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz *      http://www.apache.org/licenses/LICENSE-2.0
9d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz *
10d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * Unless required by applicable law or agreed to in writing, software
11d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * distributed under the License is distributed on an "AS IS" BASIS,
12d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * See the License for the specific language governing permissions and
14d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz * limitations under the License.
15d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz */
16d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
17d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#ifndef ART_RUNTIME_TRANSACTION_H_
18d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#define ART_RUNTIME_TRANSACTION_H_
19d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
20d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "base/macros.h"
21d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "base/mutex.h"
226a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers#include "base/value_object.h"
23e34fa1df67fbe0173b4ea9abddcc3ae3d0537037Mathieu Chartier#include "gc_root.h"
24719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers#include "object_callbacks.h"
25d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "offsets.h"
26d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "primitive.h"
27d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "safe_map.h"
28d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
29d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include <list>
30d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include <map>
31d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
32d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertznamespace art {
33d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertznamespace mirror {
34d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass Array;
35d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass Object;
36d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass String;
37d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz}
38d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass InternTable;
39d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
406a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersclass Transaction FINAL {
41d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz public:
422fd7e69505195cda4caaa3161aaf37315552a698Sebastien Hertz  static constexpr const char* kAbortExceptionDescriptor = "dalvik.system.TransactionAbortError";
432fd7e69505195cda4caaa3161aaf37315552a698Sebastien Hertz  static constexpr const char* kAbortExceptionSignature = "Ldalvik/system/TransactionAbortError;";
442fd7e69505195cda4caaa3161aaf37315552a698Sebastien Hertz
45d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  Transaction();
46d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  ~Transaction();
47d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
481c80becf5406cd6d95dc24bf47a0c5a3809ea281Sebastien Hertz  void Abort(const std::string& abort_message)
4990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_)
5090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
51b81e1cddd6a8ccccb9fe86e3bfae12b2657b8085Sebastien Hertz  void ThrowAbortError(Thread* self, const std::string* abort_message)
5290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_)
5390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
5490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier  bool IsAborted() REQUIRES(!log_lock_);
551c80becf5406cd6d95dc24bf47a0c5a3809ea281Sebastien Hertz
56d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Record object field changes.
5737f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset, uint8_t value,
5837f05ef45e0393de812d51261dc293240c17294dFred Shih                               bool is_volatile)
5990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
6037f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldByte(mirror::Object* obj, MemberOffset field_offset, int8_t value,
6137f05ef45e0393de812d51261dc293240c17294dFred Shih                               bool is_volatile)
6290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
6337f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldChar(mirror::Object* obj, MemberOffset field_offset, uint16_t value,
6437f05ef45e0393de812d51261dc293240c17294dFred Shih                            bool is_volatile)
6590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
6637f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldShort(mirror::Object* obj, MemberOffset field_offset, int16_t value,
6737f05ef45e0393de812d51261dc293240c17294dFred Shih                             bool is_volatile)
6890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
69d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteField32(mirror::Object* obj, MemberOffset field_offset, uint32_t value,
70d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                          bool is_volatile)
7190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
72d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteField64(mirror::Object* obj, MemberOffset field_offset, uint64_t value,
73d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                          bool is_volatile)
7490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
75d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteFieldReference(mirror::Object* obj, MemberOffset field_offset,
76d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                                 mirror::Object* value, bool is_volatile)
7790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
78d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
79d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Record array change.
80d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value)
8190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_)
8290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
83d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
84d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Record intern string table changes.
85cdfd39f579574a75b98e7ad48c69826b00361b27Mathieu Chartier  void RecordStrongStringInsertion(mirror::String* s)
8690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(Locks::intern_table_lock_)
8790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
88cdfd39f579574a75b98e7ad48c69826b00361b27Mathieu Chartier  void RecordWeakStringInsertion(mirror::String* s)
8990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(Locks::intern_table_lock_)
9090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
91cdfd39f579574a75b98e7ad48c69826b00361b27Mathieu Chartier  void RecordStrongStringRemoval(mirror::String* s)
9290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(Locks::intern_table_lock_)
9390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
94cdfd39f579574a75b98e7ad48c69826b00361b27Mathieu Chartier  void RecordWeakStringRemoval(mirror::String* s)
9590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(Locks::intern_table_lock_)
9690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
97d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
98d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Abort transaction by undoing all recorded changes.
991c80becf5406cd6d95dc24bf47a0c5a3809ea281Sebastien Hertz  void Rollback()
10090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_)
10190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
102d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
103bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier  void VisitRoots(RootVisitor* visitor)
10490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_)
10590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
106d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
107d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz private:
1086a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  class ObjectLog : public ValueObject {
109d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   public:
11037f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogBooleanValue(MemberOffset offset, uint8_t value, bool is_volatile);
11137f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogByteValue(MemberOffset offset, int8_t value, bool is_volatile);
11237f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogCharValue(MemberOffset offset, uint16_t value, bool is_volatile);
11337f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogShortValue(MemberOffset offset, int16_t value, bool is_volatile);
114d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void Log32BitsValue(MemberOffset offset, uint32_t value, bool is_volatile);
115d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void Log64BitsValue(MemberOffset offset, uint64_t value, bool is_volatile);
116d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void LogReferenceValue(MemberOffset offset, mirror::Object* obj, bool is_volatile);
117d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
11890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier    void Undo(mirror::Object* obj) SHARED_REQUIRES(Locks::mutator_lock_);
11990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier    void VisitRoots(RootVisitor* visitor) SHARED_REQUIRES(Locks::mutator_lock_);
120d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
121d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    size_t Size() const {
122d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      return field_values_.size();
123d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    }
124d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
125d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   private:
126d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    enum FieldValueKind {
12737f05ef45e0393de812d51261dc293240c17294dFred Shih      kBoolean,
12837f05ef45e0393de812d51261dc293240c17294dFred Shih      kByte,
12937f05ef45e0393de812d51261dc293240c17294dFred Shih      kChar,
13037f05ef45e0393de812d51261dc293240c17294dFred Shih      kShort,
131d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      k32Bits,
132d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      k64Bits,
133d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kReference
134d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
1356a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers    struct FieldValue : public ValueObject {
136d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      // TODO use JValue instead ?
137d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      uint64_t value;
138d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      FieldValueKind kind;
139d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      bool is_volatile;
140d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
141d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
14237f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogValue(FieldValueKind kind, MemberOffset offset, uint64_t value, bool is_volatile);
143d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void UndoFieldWrite(mirror::Object* obj, MemberOffset field_offset,
14490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier                        const FieldValue& field_value) SHARED_REQUIRES(Locks::mutator_lock_);
145d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
146d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Maps field's offset to its value.
147d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    std::map<uint32_t, FieldValue> field_values_;
148d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  };
149d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
1506a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  class ArrayLog : public ValueObject {
151d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   public:
152d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void LogValue(size_t index, uint64_t value);
153d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
15490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier    void Undo(mirror::Array* obj) SHARED_REQUIRES(Locks::mutator_lock_);
155d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
156d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    size_t Size() const {
157d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      return array_values_.size();
158d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    }
159d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
160d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   private:
161d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void UndoArrayWrite(mirror::Array* array, Primitive::Type array_type, size_t index,
16290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier                        uint64_t value) SHARED_REQUIRES(Locks::mutator_lock_);
163d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
164d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Maps index to value.
165d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // TODO use JValue instead ?
166d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    std::map<size_t, uint64_t> array_values_;
167d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  };
168d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
1696a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  class InternStringLog : public ValueObject {
170d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   public:
171d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    enum StringKind {
172d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kStrongString,
173d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kWeakString
174d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
175d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    enum StringOp {
176d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kInsert,
177d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kRemove
178d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
179cdfd39f579574a75b98e7ad48c69826b00361b27Mathieu Chartier    InternStringLog(mirror::String* s, StringKind kind, StringOp op)
180cdfd39f579574a75b98e7ad48c69826b00361b27Mathieu Chartier      : str_(s), string_kind_(kind), string_op_(op) {
181ee1d79a603c77c0667b27c075a983579d5c51f7eSebastien Hertz      DCHECK(s != nullptr);
182d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    }
183d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
1841bd4872773184fb9f5f152c7bbf9856a8235d2afHiroshi Yamauchi    void Undo(InternTable* intern_table)
18590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier        SHARED_REQUIRES(Locks::mutator_lock_)
18690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier        REQUIRES(Locks::intern_table_lock_);
18790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier    void VisitRoots(RootVisitor* visitor) SHARED_REQUIRES(Locks::mutator_lock_);
188d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
189d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   private:
190d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    mirror::String* str_;
1916a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers    const StringKind string_kind_;
1926a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers    const StringOp string_op_;
193d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  };
194d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
1956a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  void LogInternedString(const InternStringLog& log)
19690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(Locks::intern_table_lock_)
19790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(!log_lock_);
198d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
199d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void UndoObjectModifications()
20090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(log_lock_)
20190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
202d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void UndoArrayModifications()
20390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(log_lock_)
20490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
205d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void UndoInternStringTableModifications()
20690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(Locks::intern_table_lock_)
20790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(log_lock_)
20890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
209d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
210bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier  void VisitObjectLogs(RootVisitor* visitor)
21190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(log_lock_)
21290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
213bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier  void VisitArrayLogs(RootVisitor* visitor)
21490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(log_lock_)
21590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
216bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier  void VisitStringLogs(RootVisitor* visitor)
21790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      REQUIRES(log_lock_)
21890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
219d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
22090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier  const std::string& GetAbortMessage() REQUIRES(!log_lock_);
2211c80becf5406cd6d95dc24bf47a0c5a3809ea281Sebastien Hertz
222d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  Mutex log_lock_ ACQUIRED_AFTER(Locks::intern_table_lock_);
223d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  std::map<mirror::Object*, ObjectLog> object_logs_ GUARDED_BY(log_lock_);
224d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  std::map<mirror::Array*, ArrayLog> array_logs_  GUARDED_BY(log_lock_);
225d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  std::list<InternStringLog> intern_string_logs_ GUARDED_BY(log_lock_);
2261c80becf5406cd6d95dc24bf47a0c5a3809ea281Sebastien Hertz  bool aborted_ GUARDED_BY(log_lock_);
2271c80becf5406cd6d95dc24bf47a0c5a3809ea281Sebastien Hertz  std::string abort_message_ GUARDED_BY(log_lock_);
228d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
229d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  DISALLOW_COPY_AND_ASSIGN(Transaction);
230d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz};
231d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
232d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz}  // namespace art
233d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
234d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#endif  // ART_RUNTIME_TRANSACTION_H_
235