b5979eaa5b
This is a reland of 90ea9b35cb
Original change's description:
> cppgc: Port backing store compaction.
>
> This CL ports the existing backing store compaction algorithm from
> blink. It does not attempt to improve on the existing algorithm.
>
> Currently only unified heap uses the compaction implementation. It is
> never triggered through standalone GCs.
>
> The compaction implementation resides within an internal "subtle" namespace.
>
> Bug: v8:10990
> Change-Id: I4aa781db1b711e7aafc34234c4fb142de84394d7
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2485228
> Commit-Queue: Omer Katz <omerkatz@chromium.org>
> Reviewed-by: Anton Bikineev <bikineev@chromium.org>
> Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#70714}
Bug: v8:10990
Change-Id: I527c2042a26648d058bfe4d355527cce9a3eeadc
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2492331
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#70736}
92 lines
2.3 KiB
C++
92 lines
2.3 KiB
C++
// 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 INCLUDE_CPPGC_CUSTOM_SPACE_H_
|
|
#define INCLUDE_CPPGC_CUSTOM_SPACE_H_
|
|
|
|
#include <stddef.h>
|
|
|
|
namespace cppgc {
|
|
|
|
struct CustomSpaceIndex {
|
|
CustomSpaceIndex(size_t value) : value(value) {} // NOLINT
|
|
size_t value;
|
|
};
|
|
|
|
/**
|
|
* Top-level base class for custom spaces. Users must inherit from CustomSpace
|
|
* below.
|
|
*/
|
|
class CustomSpaceBase {
|
|
public:
|
|
virtual ~CustomSpaceBase() = default;
|
|
virtual CustomSpaceIndex GetCustomSpaceIndex() const = 0;
|
|
virtual bool IsCompactable() const = 0;
|
|
};
|
|
|
|
/**
|
|
* Base class custom spaces should directly inherit from. The class inheriting
|
|
* from `CustomSpace` must define `kSpaceIndex` as unique space index. These
|
|
* indices need for form a sequence starting at 0.
|
|
*
|
|
* Example:
|
|
* \code
|
|
* class CustomSpace1 : public CustomSpace<CustomSpace1> {
|
|
* public:
|
|
* static constexpr CustomSpaceIndex kSpaceIndex = 0;
|
|
* };
|
|
* class CustomSpace2 : public CustomSpace<CustomSpace2> {
|
|
* public:
|
|
* static constexpr CustomSpaceIndex kSpaceIndex = 1;
|
|
* };
|
|
* \endcode
|
|
*/
|
|
template <typename ConcreteCustomSpace>
|
|
class CustomSpace : public CustomSpaceBase {
|
|
public:
|
|
CustomSpaceIndex GetCustomSpaceIndex() const final {
|
|
return ConcreteCustomSpace::kSpaceIndex;
|
|
}
|
|
bool IsCompactable() const final {
|
|
return ConcreteCustomSpace::kSupportsCompaction;
|
|
}
|
|
|
|
protected:
|
|
static constexpr bool kSupportsCompaction = false;
|
|
};
|
|
|
|
/**
|
|
* User-overridable trait that allows pinning types to custom spaces.
|
|
*/
|
|
template <typename T, typename = void>
|
|
struct SpaceTrait {
|
|
using Space = void;
|
|
};
|
|
|
|
namespace internal {
|
|
|
|
template <typename CustomSpace>
|
|
struct IsAllocatedOnCompactableSpaceImpl {
|
|
static constexpr bool value = CustomSpace::kSupportsCompaction;
|
|
};
|
|
|
|
template <>
|
|
struct IsAllocatedOnCompactableSpaceImpl<void> {
|
|
// Non-custom spaces are by default not compactable.
|
|
static constexpr bool value = false;
|
|
};
|
|
|
|
template <typename T>
|
|
struct IsAllocatedOnCompactableSpace {
|
|
public:
|
|
static constexpr bool value =
|
|
IsAllocatedOnCompactableSpaceImpl<typename SpaceTrait<T>::Space>::value;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace cppgc
|
|
|
|
#endif // INCLUDE_CPPGC_CUSTOM_SPACE_H_
|