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