// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// 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 COBALT_SCRIPT_V8C_V8C_HEAP_TRACER_H_
#define COBALT_SCRIPT_V8C_V8C_HEAP_TRACER_H_

#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#include "cobalt/script/v8c/isolate_fellowship.h"
#include "cobalt/script/v8c/scoped_persistent.h"
#include "cobalt/script/wrappable.h"
#include "v8/include/v8-platform.h"
#include "v8/include/v8.h"

namespace cobalt {
namespace script {
namespace v8c {

class V8cHeapTracer final : public v8::EmbedderHeapTracer,
                            public ::cobalt::script::Tracer {
 public:
  explicit V8cHeapTracer(v8::Isolate* isolate) : isolate_(isolate) {}

  // V8 EmbedderHeapTracer API
  void RegisterV8References(
      const std::vector<std::pair<void*, void*>>& embedder_fields) override;
  void TracePrologue() override;
  bool AdvanceTracing(double deadline_in_ms) override;
  bool IsTracingDone() override;
  void TraceEpilogue() override;
  void EnterFinalPause(EmbedderStackState stack_state) override;
  // IsRootForNonTracingGC provides an opportunity for us to get quickly
  // perished reference deleted in scavenger GCs. But that requires the ability
  // to determine whether a v8 object is reference by anything in Cobalt heap.
  // Cobalt does have the reference_map_ that tracks all ScriptValues but Cobalt
  // does not track referencers of all wrappables yet. So we don't have the
  // ability to exploit this feature yet.

  // bool IsRootForNonTracingGC(const v8::TracedGlobal<v8::Value>& handle)
  // override

  // Cobalt Tracer API
  void Trace(Traceable* traceable) override;

  void AddReferencedObject(Wrappable* owner,
                           ScopedPersistent<v8::Value>* value);
  void RemoveReferencedObject(Wrappable* owner,
                              ScopedPersistent<v8::Value>* value);

  void AddRoot(Traceable* traceable);
  void RemoveRoot(Traceable* traceable);

  // Used during shutdown to ask V8cHeapTracer do nothing so that V8 can
  // GC every embedder-created object.
  void DisableForShutdown() {
    disabled_ = true;
  }

 private:
  void MaybeAddToFrontier(Traceable* traceable);

  v8::Isolate* const isolate_;
  v8::Platform* const platform_ =
      IsolateFellowship::GetInstance()->platform.get();

  std::vector<Traceable*> frontier_;
  std::unordered_set<Traceable*> visited_;
  std::unordered_multimap<Wrappable*, ScopedPersistent<v8::Value>*>
      reference_map_;

  // TODO: A "counted" multiset approach here would be a bit nicer than
  // std::multiset.
  std::unordered_multiset<Traceable*> roots_;

  bool disabled_ = false;
};

}  // namespace v8c
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_V8C_V8C_HEAP_TRACER_H_
