xo-gc: generation -> Generation + bugfix idle test
This commit is contained in:
parent
95add0cc0e
commit
8aa718695c
5 changed files with 26 additions and 26 deletions
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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(); }
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue