transaction.h revision 37f05ef45e0393de812d51261dc293240c17294d
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"
22719d1a33f6569864f529e5a3fff59e7bca97aad0Ian Rogers#include "object_callbacks.h"
23d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "offsets.h"
24d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "primitive.h"
25d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include "safe_map.h"
26d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
27d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include <list>
28d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#include <map>
29d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
30d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertznamespace art {
31d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertznamespace mirror {
32d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass Array;
33d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass Object;
34d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass String;
35d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz}
36d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass InternTable;
37d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
38d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertzclass Transaction {
39d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz public:
40d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  Transaction();
41d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  ~Transaction();
42d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
43d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Record object field changes.
4437f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset, uint8_t value,
4537f05ef45e0393de812d51261dc293240c17294dFred Shih                               bool is_volatile)
4637f05ef45e0393de812d51261dc293240c17294dFred Shih      LOCKS_EXCLUDED(log_lock_);
4737f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldByte(mirror::Object* obj, MemberOffset field_offset, int8_t value,
4837f05ef45e0393de812d51261dc293240c17294dFred Shih                               bool is_volatile)
4937f05ef45e0393de812d51261dc293240c17294dFred Shih      LOCKS_EXCLUDED(log_lock_);
5037f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldChar(mirror::Object* obj, MemberOffset field_offset, uint16_t value,
5137f05ef45e0393de812d51261dc293240c17294dFred Shih                            bool is_volatile)
5237f05ef45e0393de812d51261dc293240c17294dFred Shih      LOCKS_EXCLUDED(log_lock_);
5337f05ef45e0393de812d51261dc293240c17294dFred Shih  void RecordWriteFieldShort(mirror::Object* obj, MemberOffset field_offset, int16_t value,
5437f05ef45e0393de812d51261dc293240c17294dFred Shih                             bool is_volatile)
5537f05ef45e0393de812d51261dc293240c17294dFred Shih      LOCKS_EXCLUDED(log_lock_);
56d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteField32(mirror::Object* obj, MemberOffset field_offset, uint32_t value,
57d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                          bool is_volatile)
58d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
59d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteField64(mirror::Object* obj, MemberOffset field_offset, uint64_t value,
60d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                          bool is_volatile)
61d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
62d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteFieldReference(mirror::Object* obj, MemberOffset field_offset,
63d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                                 mirror::Object* value, bool is_volatile)
64d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
65d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
66d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Record array change.
67d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value)
68d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_)
69d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
70d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
71d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Record intern string table changes.
72d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordStrongStringInsertion(mirror::String* s, uint32_t hash_code)
73d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_)
74d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
75d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWeakStringInsertion(mirror::String* s, uint32_t hash_code)
76d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_)
77d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
78d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordStrongStringRemoval(mirror::String* s, uint32_t hash_code)
79d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_)
80d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
81d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void RecordWeakStringRemoval(mirror::String* s, uint32_t hash_code)
82d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_)
83d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
84d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
85d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  // Abort transaction by undoing all recorded changes.
86d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void Abort()
87d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
88d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
89d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
90d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void VisitRoots(RootCallback* callback, void* arg)
91d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_)
92d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
93d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
94d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz private:
95d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  class ObjectLog {
96d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   public:
9737f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogBooleanValue(MemberOffset offset, uint8_t value, bool is_volatile);
9837f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogByteValue(MemberOffset offset, int8_t value, bool is_volatile);
9937f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogCharValue(MemberOffset offset, uint16_t value, bool is_volatile);
10037f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogShortValue(MemberOffset offset, int16_t value, bool is_volatile);
101d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void Log32BitsValue(MemberOffset offset, uint32_t value, bool is_volatile);
102d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void Log64BitsValue(MemberOffset offset, uint64_t value, bool is_volatile);
103d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void LogReferenceValue(MemberOffset offset, mirror::Object* obj, bool is_volatile);
104d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
105d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void Undo(mirror::Object* obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
106d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void VisitRoots(RootCallback* callback, void* arg);
107d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
108d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    size_t Size() const {
109d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      return field_values_.size();
110d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    }
111d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
112d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   private:
113d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    enum FieldValueKind {
11437f05ef45e0393de812d51261dc293240c17294dFred Shih      kBoolean,
11537f05ef45e0393de812d51261dc293240c17294dFred Shih      kByte,
11637f05ef45e0393de812d51261dc293240c17294dFred Shih      kChar,
11737f05ef45e0393de812d51261dc293240c17294dFred Shih      kShort,
118d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      k32Bits,
119d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      k64Bits,
120d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kReference
121d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
122d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    struct FieldValue {
123d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      // TODO use JValue instead ?
124d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      uint64_t value;
125d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      FieldValueKind kind;
126d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      bool is_volatile;
127d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
128d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
12937f05ef45e0393de812d51261dc293240c17294dFred Shih    void LogValue(FieldValueKind kind, MemberOffset offset, uint64_t value, bool is_volatile);
130d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void UndoFieldWrite(mirror::Object* obj, MemberOffset field_offset,
131d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                        const FieldValue& field_value) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
132d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
133d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Maps field's offset to its value.
134d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    std::map<uint32_t, FieldValue> field_values_;
135d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  };
136d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
137d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  class ArrayLog {
138d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   public:
139d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void LogValue(size_t index, uint64_t value);
140d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
141d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void Undo(mirror::Array* obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
142d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
143d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    size_t Size() const {
144d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      return array_values_.size();
145d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    }
146d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
147d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   private:
148d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void UndoArrayWrite(mirror::Array* array, Primitive::Type array_type, size_t index,
149d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz                        uint64_t value) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
150d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
151d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Maps index to value.
152d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // TODO use JValue instead ?
153d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    std::map<size_t, uint64_t> array_values_;
154d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  };
155d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
156d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  class InternStringLog {
157d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   public:
158d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    enum StringKind {
159d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kStrongString,
160d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kWeakString
161d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
162d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    enum StringOp {
163d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kInsert,
164d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      kRemove
165d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    };
166d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    InternStringLog(mirror::String* s, uint32_t hash_code, StringKind kind, StringOp op)
167d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      : str_(s), hash_code_(hash_code), string_kind_(kind), string_op_(op) {
168ee1d79a603c77c0667b27c075a983579d5c51f7eSebastien Hertz      DCHECK(s != nullptr);
169d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    }
170d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
1711bd4872773184fb9f5f152c7bbf9856a8235d2afHiroshi Yamauchi    void Undo(InternTable* intern_table)
1721bd4872773184fb9f5f152c7bbf9856a8235d2afHiroshi Yamauchi        SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
1731bd4872773184fb9f5f152c7bbf9856a8235d2afHiroshi Yamauchi        EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_);
174d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    void VisitRoots(RootCallback* callback, void* arg);
175d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
176d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz   private:
177d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    mirror::String* str_;
178d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    uint32_t hash_code_;
179d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    StringKind string_kind_;
180d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    StringOp string_op_;
181d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  };
182d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
183d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void LogInternedString(InternStringLog& log)
184d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_)
185d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      LOCKS_EXCLUDED(log_lock_);
186d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
187d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void UndoObjectModifications()
188d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(log_lock_)
189d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
190d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void UndoArrayModifications()
191d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(log_lock_)
192d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
193d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void UndoInternStringTableModifications()
194d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(Locks::intern_table_lock_)
1951bd4872773184fb9f5f152c7bbf9856a8235d2afHiroshi Yamauchi      EXCLUSIVE_LOCKS_REQUIRED(log_lock_)
1961bd4872773184fb9f5f152c7bbf9856a8235d2afHiroshi Yamauchi      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
197d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
198d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void VisitObjectLogs(RootCallback* callback, void* arg)
199d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(log_lock_)
200d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
201d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void VisitArrayLogs(RootCallback* callback, void* arg)
202d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(log_lock_)
203d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
204d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  void VisitStringLogs(RootCallback* callback, void* arg)
205d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      EXCLUSIVE_LOCKS_REQUIRED(log_lock_)
206d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
207d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
208d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  Mutex log_lock_ ACQUIRED_AFTER(Locks::intern_table_lock_);
209d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  std::map<mirror::Object*, ObjectLog> object_logs_ GUARDED_BY(log_lock_);
210d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  std::map<mirror::Array*, ArrayLog> array_logs_  GUARDED_BY(log_lock_);
211d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  std::list<InternStringLog> intern_string_logs_ GUARDED_BY(log_lock_);
212d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
213d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  DISALLOW_COPY_AND_ASSIGN(Transaction);
214d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz};
215d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
216d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz}  // namespace art
217d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz
218d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz#endif  // ART_RUNTIME_TRANSACTION_H_
219