1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_BASE_MUTATOR_LOCKED_DUMPABLE_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_BASE_MUTATOR_LOCKED_DUMPABLE_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "base/locks.h" 21*795d594fSAndroid Build Coastguard Worker #include "thread-current-inl.h" 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker template<typename T> 26*795d594fSAndroid Build Coastguard Worker class MutatorLockedDumpable { 27*795d594fSAndroid Build Coastguard Worker public: MutatorLockedDumpable(T & value)28*795d594fSAndroid Build Coastguard Worker explicit MutatorLockedDumpable(T& value) REQUIRES_SHARED(Locks::mutator_lock_) : value_(value) {} 29*795d594fSAndroid Build Coastguard Worker Dump(std::ostream & os)30*795d594fSAndroid Build Coastguard Worker void Dump(std::ostream& os) const REQUIRES_SHARED(Locks::mutator_lock_) { 31*795d594fSAndroid Build Coastguard Worker value_.Dump(os); 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker private: 35*795d594fSAndroid Build Coastguard Worker const T& value_; 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(MutatorLockedDumpable); 38*795d594fSAndroid Build Coastguard Worker }; 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker // template<typename T> 41*795d594fSAndroid Build Coastguard Worker // std::ostream& operator<<(std::ostream& os, const MutatorLockedDumpable<T>& rhs) 42*795d594fSAndroid Build Coastguard Worker // // TODO: should be REQUIRES_SHARED(Locks::mutator_lock_) however annotalysis 43*795d594fSAndroid Build Coastguard Worker // // currently fails for this. 44*795d594fSAndroid Build Coastguard Worker // NO_THREAD_SAFETY_ANALYSIS; 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker template<typename T> 47*795d594fSAndroid Build Coastguard Worker inline std::ostream& operator<<(std::ostream& os, const MutatorLockedDumpable<T>& rhs) 48*795d594fSAndroid Build Coastguard Worker NO_THREAD_SAFETY_ANALYSIS { 49*795d594fSAndroid Build Coastguard Worker Locks::mutator_lock_->AssertSharedHeld(Thread::Current()); 50*795d594fSAndroid Build Coastguard Worker rhs.Dump(os); 51*795d594fSAndroid Build Coastguard Worker return os; 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker } // namespace art 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_BASE_MUTATOR_LOCKED_DUMPABLE_H_ 57