xo-gc: generation -> Generation + bugfix idle test

This commit is contained in:
Roland Conybeare 2026-03-26 11:30:16 -04:00
commit 8aa718695c
5 changed files with 26 additions and 26 deletions

View file

@ -38,11 +38,11 @@ namespace xo {
virtual typeseq _typeseq() const noexcept = 0;
virtual size_type allocated(Copaque d,
generation g, role r) const noexcept = 0;
Generation g, role r) const noexcept = 0;
virtual size_type reserved(Copaque d,
generation g, role r) const noexcept = 0;
Generation g, role r) const noexcept = 0;
virtual size_type committed(Copaque d,
generation g, role r) const noexcept = 0;
Generation g, role r) const noexcept = 0;
virtual bool is_type_installed(Copaque d,
typeseq tseq) const noexcept = 0;
@ -74,7 +74,7 @@ namespace xo {
* 3. if collection is currently disabled,
* collection will trigger the next time gc is enabled.
**/
virtual void request_gc(Opaque d, generation upto) = 0;
virtual void request_gc(Opaque d, Generation upto) = 0;
/** Assign pointer @p p_lhs to destination @p rhs, within parent allocation @p parent
*

View file

@ -31,16 +31,16 @@ namespace xo {
typeseq _typeseq() const noexcept override { return s_typeseq; }
// const methods
[[noreturn]] size_type allocated(Copaque, generation, role) const noexcept override { _fatal(); }
[[noreturn]] size_type reserved(Copaque, generation, role) const noexcept override { _fatal(); }
[[noreturn]] size_type committed(Copaque, generation, role) const noexcept override { _fatal(); }
[[noreturn]] size_type allocated(Copaque, Generation, role) const noexcept override { _fatal(); }
[[noreturn]] size_type reserved(Copaque, Generation, role) const noexcept override { _fatal(); }
[[noreturn]] size_type committed(Copaque, Generation, role) const noexcept override { _fatal(); }
[[noreturn]] bool is_type_installed(Copaque, typeseq) const noexcept override { _fatal(); }
// non-const methods
[[noreturn]] bool install_type(Opaque, const AGCObject &) noexcept override { _fatal(); }
[[noreturn]] void add_gc_root_poly(Opaque, obj<AGCObject> *) override { _fatal(); }
[[noreturn]] void remove_gc_root_poly(Opaque, obj<AGCObject> *) override { _fatal(); }
[[noreturn]] void request_gc(Opaque, generation) override { _fatal(); }
[[noreturn]] void request_gc(Opaque, Generation) override { _fatal(); }
[[noreturn]] void assign_member(Opaque, void *,
obj<AGCObject> *, obj<AGCObject> &) override { _fatal(); }
[[noreturn]] void forward_inplace(Opaque, AGCObject *, void **) override { _fatal(); }

View file

@ -32,13 +32,13 @@ namespace xo {
// const methods
typeseq _typeseq() const noexcept override { return s_typeseq; }
size_type allocated(Copaque d, generation g, role r) const noexcept override {
size_type allocated(Copaque d, Generation g, role r) const noexcept override {
return I::allocated(_dcast(d), g, r);
}
size_type reserved(Copaque d, generation g, role r) const noexcept override {
size_type reserved(Copaque d, Generation g, role r) const noexcept override {
return I::reserved(_dcast(d), g, r);
}
size_type committed(Copaque d, generation g, role r) const noexcept override {
size_type committed(Copaque d, Generation g, role r) const noexcept override {
return I::committed(_dcast(d), g, r);
}
bool is_type_installed(Copaque d, typeseq tseq) const noexcept override {
@ -56,7 +56,7 @@ namespace xo {
void remove_gc_root_poly(Opaque d, obj<AGCObject> * p_root) override {
I::remove_gc_root_poly(_dcast(d), p_root);
}
void request_gc(Opaque d, generation upto) override {
void request_gc(Opaque d, Generation upto) override {
I::request_gc(_dcast(d), upto);
}
void assign_member(Opaque d, void * parent,

View file

@ -42,15 +42,15 @@ namespace xo {
void forward_pivot_inplace(obj<AFacet,DRepr> * p_obj);
int32_t _typeseq() const noexcept { return O::iface()->_typeseq(); }
size_type allocated(generation g, role r) const noexcept { return O::iface()->allocated(O::data(), g, r); }
size_type reserved(generation g, role r) const noexcept { return O::iface()->reserved(O::data(), g, r); }
size_type committed(generation g, role r) const noexcept { return O::iface()->committed(O::data(), g, r); }
size_type allocated(Generation g, role r) const noexcept { return O::iface()->allocated(O::data(), g, r); }
size_type reserved(Generation g, role r) const noexcept { return O::iface()->reserved(O::data(), g, r); }
size_type committed(Generation g, role r) const noexcept { return O::iface()->committed(O::data(), g, r); }
bool is_type_installed(typeseq tseq) const noexcept { return O::iface()->is_type_installed(O::data(), tseq); }
bool install_type(const AGCObject & iface) { return O::iface()->install_type(O::data(), iface); }
void add_gc_root_poly(obj<AGCObject> * p_root) { O::iface()->add_gc_root_poly(O::data(), p_root); }
void remove_gc_root_poly(obj<AGCObject> * p_root) { O::iface()->remove_gc_root_poly(O::data(), p_root); }
void request_gc(generation g) { O::iface()->request_gc(O::data(), g); }
void request_gc(Generation g) { O::iface()->request_gc(O::data(), g); }
void assign_member(void * parent,
obj<AGCObject> * p_lhs,

View file

@ -11,38 +11,38 @@
namespace xo {
namespace mm {
/** hard maximum number of generations **/
static constexpr uint32_t c_max_generation = 16;
static constexpr uint32_t c_max_generation = 2;
/** @class generation
* @brief type-safe generation number
**/
struct generation {
struct Generation {
using value_type = std::uint32_t;
constexpr generation() = default;
explicit constexpr generation(value_type x) : value_{x} {}
constexpr Generation() = default;
explicit constexpr Generation(value_type x) : value_{x} {}
static generation nursery() { return generation{0}; }
static generation sentinel() { return generation(c_max_generation); }
static Generation nursery() { return Generation{0}; }
static Generation sentinel() { return Generation(c_max_generation); }
bool is_sentinel() const noexcept { return value_ == c_max_generation; }
constexpr operator value_type() const { return value_; }
generation & operator++() { ++value_; return *this; }
Generation & operator++() { ++value_; return *this; }
std::uint32_t value_ = 0;
};
inline bool operator==(generation lhs, generation rhs) {
inline bool operator==(Generation lhs, Generation rhs) {
return lhs.value_ == rhs.value_;
}
inline bool operator<(generation lhs, generation rhs) {
inline bool operator<(Generation lhs, Generation rhs) {
return lhs.value_ < rhs.value_;
}
inline bool operator>(generation lhs, generation rhs) {
inline bool operator>(Generation lhs, Generation rhs) {
return lhs.value_ > rhs.value_;
}