// Copyright 2016 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_MOZJS_45_WEAK_HEAP_OBJECT_MANAGER_H_
#define COBALT_SCRIPT_MOZJS_45_WEAK_HEAP_OBJECT_MANAGER_H_

#include <vector>

#include "base/containers/hash_tables.h"

// Can be locally set to 1 to track the call stack where a weak heap object
// was tracked from, and then dump the call stacks of any remaining objects in
// |WeakHeapObjectManager|'s destructor before hitting the DCHECK that
// verifies that no objects are remaining.
//
// Example workflow for processing the output of this on linux:
//   # Copy a dumped callstack to the clipboard.
//   $ xclip -selection c -o |
//       grep -o '0x[[:xdigit:]]*' |
//       addr2line -e out/linux-x64x11_debug/cobalt
#define COBALT_TRACK_WEAK_HEAP_OBJECT_ADDED_FROM_LOCATION 0

namespace cobalt {
namespace script {
namespace mozjs {

class WeakHeapObject;

// WeakHeapObjectManager holds a reference to all WeakHeapObject instances. The
// SweepUnmarkedObjects function should be called during garbage collection
// after the marking phase. The underlying JS::Heap<> handle for any unmarked
// handles will be set to NULL.
class WeakHeapObjectManager {
 public:
  // Iterates over all WeakHeapObjects and sets their JS::Heap<> handles to NULL
  // if the objects to which they hold a reference are about to be finalized.
  void SweepUnmarkedObjects();
  ~WeakHeapObjectManager();

 private:
  void StartTracking(WeakHeapObject* weak_object);
  void StopTracking(WeakHeapObject* weak_object);

  // Returns true if the underlying pointer is NULL, which will be the case if
  // the object has been swept.
  bool MaybeSweep(WeakHeapObject* weak_object);

  typedef base::hash_set<WeakHeapObject*> WeakHeapObjects;
  WeakHeapObjects weak_objects_;

#if COBALT_TRACK_WEAK_HEAP_OBJECT_ADDED_FROM_LOCATION
  base::hash_map<WeakHeapObject*, std::vector<void*>> added_from_;
#endif

  friend class WeakHeapObject;
};

}  // namespace mozjs
}  // namespace script
}  // namespace cobalt

#endif  // COBALT_SCRIPT_MOZJS_45_WEAK_HEAP_OBJECT_MANAGER_H_
