/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ART_RUNTIME_GC_ROOT_H_
#define ART_RUNTIME_GC_ROOT_H_

#include "base/mutex.h"       // For Locks::mutator_lock_.
#include "object_callbacks.h"

namespace art {

template<class MirrorType>
class GcRoot {
 public:
  template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
  ALWAYS_INLINE MirrorType* Read() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);

  void VisitRoot(RootCallback* callback, void* arg, uint32_t thread_id, RootType root_type) {
    callback(reinterpret_cast<mirror::Object**>(&root_), arg, thread_id, root_type);
  }

  // This is only used by IrtIterator.
  ALWAYS_INLINE MirrorType** AddressWithoutBarrier() {
    return &root_;
  }

  bool IsNull() const {
    // It's safe to null-check it without a read barrier.
    return root_ == nullptr;
  }

  ALWAYS_INLINE explicit GcRoot<MirrorType>() : root_(nullptr) {
  }

  ALWAYS_INLINE explicit GcRoot<MirrorType>(MirrorType* ref)
      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) : root_(ref) {
  }

 private:
  MirrorType* root_;
};

}  // namespace art

#endif  // ART_RUNTIME_GC_ROOT_H_
