// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_HEAP_CPPGC_HEAP_GROWING_H_
#define V8_HEAP_CPPGC_HEAP_GROWING_H_

#include "include/cppgc/heap.h"
#include "src/base/macros.h"
#include "src/heap/cppgc/globals.h"
#include "src/heap/cppgc/raw-heap.h"

namespace cppgc {

class Platform;

namespace internal {

class GarbageCollector;
class StatsCollector;

// Growing strategy that invokes garbage collection using GarbageCollector based
// on allocation statistics provided by StatsCollector and ResourceConstraints.
//
// Implements a fixed-ratio growing strategy with an initial heap size that the
// GC can ignore to avoid excessive GCs for smaller heaps.
class V8_EXPORT_PRIVATE HeapGrowing final {
 public:
  // Constant growing factor for growing the heap limit.
  static constexpr double kGrowingFactor = 1.5;
  // For smaller heaps, allow allocating at least LAB in each regular space
  // before triggering GC again.
  static constexpr size_t kMinLimitIncrease =
      kPageSize * RawHeap::kNumberOfRegularSpaces;

  HeapGrowing(GarbageCollector*, StatsCollector*,
              cppgc::Heap::ResourceConstraints);
  ~HeapGrowing();

  HeapGrowing(const HeapGrowing&) = delete;
  HeapGrowing& operator=(const HeapGrowing&) = delete;

  size_t limit_for_atomic_gc() const;
  size_t limit_for_incremental_gc() const;

  void DisableForTesting();

 private:
  class HeapGrowingImpl;
  std::unique_ptr<HeapGrowingImpl> impl_;
};

}  // namespace internal
}  // namespace cppgc

#endif  // V8_HEAP_CPPGC_HEAP_GROWING_H_
