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