// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef RUNTIME_VM_VIRTUAL_MEMORY_COMPRESSED_H_
#define RUNTIME_VM_VIRTUAL_MEMORY_COMPRESSED_H_

#include "vm/globals.h"
#include "vm/heap/pages.h"
#include "vm/memory_region.h"

namespace dart {

#if defined(DART_COMPRESSED_POINTERS)
static constexpr intptr_t kCompressedHeapSize = 4 * GB;
static constexpr intptr_t kCompressedHeapAlignment = 4 * GB;
static constexpr intptr_t kCompressedHeapPageSize = kOldPageSize;
static constexpr intptr_t kCompressedHeapNumPages =
    kCompressedHeapSize / kOldPageSize;
static constexpr intptr_t kCompressedHeapBitmapSize =
    kCompressedHeapNumPages / 8;

#if !defined(HOST_OS_FUCHSIA)
#define DART_COMPRESSED_HEAP
#endif  // !defined(HOST_OS_FUCHSIA)
#endif  // defined(DART_COMPRESSED_POINTERS)

#if defined(DART_COMPRESSED_HEAP)

// Utilities for allocating memory within a contiguous region of memory, for use
// with compressed pointers.
class VirtualMemoryCompressedHeap : public AllStatic {
 public:
  // Initializes the compressed heap. The callee must allocate a region of
  // kCompressedHeapSize bytes, aligned to kCompressedHeapSize.
  static void Init(void* compressed_heap_region);

  // Cleans up the compressed heap. The callee is responsible for freeing the
  // region's memory.
  static void Cleanup();

  // Allocates a segment of the compressed heap with the given size. Returns a
  // heap memory region if a large enough free segment can't be found.
  static MemoryRegion Allocate(intptr_t size, intptr_t alignment);

  // Frees a segment.
  static void Free(void* address, intptr_t size);

  // Returns whether the address is within the compressed heap.
  static bool Contains(void* address);

  // Returns a pointer to the compressed heap region.
  static void* GetRegion();

 private:
  static bool IsPageUsed(uword page_id);
  static void SetPageUsed(uword page_id);
  static void ClearPageUsed(uword page_id);

  static uword base_;
  static uint8_t* pages_;
  static uword minimum_free_page_id_;
  static Mutex* mutex_;
};

#endif  // defined(DART_COMPRESSED_HEAP)

}  // namespace dart

#endif  // RUNTIME_VM_VIRTUAL_MEMORY_COMPRESSED_H_
