1e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier/* 2e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * Copyright (C) 2015 The Android Open Source Project 3e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * 4e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 5e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * you may not use this file except in compliance with the License. 6e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * You may obtain a copy of the License at 7e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * 8e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 9e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * 10e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 11e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 12e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * See the License for the specific language governing permissions and 14e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier * limitations under the License. 15e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier */ 16e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 17e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier#ifndef ART_RUNTIME_CLASS_TABLE_INL_H_ 18e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier#define ART_RUNTIME_CLASS_TABLE_INL_H_ 19e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 20e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier#include "class_table.h" 21e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 22e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartiernamespace art { 23e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 24e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartiertemplate<class Visitor> 25e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartiervoid ClassTable::VisitRoots(Visitor& visitor) { 261609e3a42051769f4a8be3b6731e7bb2f828b3bbMathieu Chartier ReaderMutexLock mu(Thread::Current(), lock_); 27e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier for (ClassSet& class_set : classes_) { 28e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier for (GcRoot<mirror::Class>& root : class_set) { 29e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier visitor.VisitRoot(root.AddressWithoutBarrier()); 30e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier } 31e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier } 32c9dbb1df3b5c06ba122cacaf35b17cb53c6be3c6Mathieu Chartier for (GcRoot<mirror::Object>& root : strong_roots_) { 331aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier visitor.VisitRoot(root.AddressWithoutBarrier()); 341aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier } 35e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier} 36e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 37e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartiertemplate<class Visitor> 38e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartiervoid ClassTable::VisitRoots(const Visitor& visitor) { 391609e3a42051769f4a8be3b6731e7bb2f828b3bbMathieu Chartier ReaderMutexLock mu(Thread::Current(), lock_); 40e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier for (ClassSet& class_set : classes_) { 41e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier for (GcRoot<mirror::Class>& root : class_set) { 42e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier visitor.VisitRoot(root.AddressWithoutBarrier()); 43e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier } 44e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier } 45c9dbb1df3b5c06ba122cacaf35b17cb53c6be3c6Mathieu Chartier for (GcRoot<mirror::Object>& root : strong_roots_) { 4600310e0bb4ee541b99f0b687dbf5f706db2aabcaMathieu Chartier visitor.VisitRoot(root.AddressWithoutBarrier()); 4700310e0bb4ee541b99f0b687dbf5f706db2aabcaMathieu Chartier } 48e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier} 49e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 501aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartiertemplate <typename Visitor> 511aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartierbool ClassTable::Visit(Visitor& visitor) { 521609e3a42051769f4a8be3b6731e7bb2f828b3bbMathieu Chartier ReaderMutexLock mu(Thread::Current(), lock_); 531aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier for (ClassSet& class_set : classes_) { 541aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier for (GcRoot<mirror::Class>& root : class_set) { 551aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier if (!visitor(root.Read())) { 561aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier return false; 571aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier } 581aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier } 591aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier } 601aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier return true; 611aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier} 621aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier 631aa8ec2ccdd7bedb6d30d91c89f1e94ab23c4439Mathieu Chartier 64e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier} // namespace art 65e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier 66e4275c07e9852a6944f47efa9d0591fceb8e8e36Mathieu Chartier#endif // ART_RUNTIME_CLASS_TABLE_INL_H_ 67