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