xo-alloc: alter GC to use LinearAlloc directly - retire ListAlloc
This commit is contained in:
parent
279a1a040c
commit
2ec5072092
3 changed files with 29 additions and 24 deletions
|
|
@ -28,15 +28,20 @@ namespace xo {
|
|||
ArenaAlloc(ArenaAlloc &&) = delete;
|
||||
~ArenaAlloc();
|
||||
|
||||
/** create allocator with capacity @p z,
|
||||
/** Create allocator with capacity @p z,
|
||||
* Reserve memory addresses for @p z bytes,
|
||||
* but don't commit them until needed
|
||||
**/
|
||||
static up<ArenaAlloc> make(const std::string & name,
|
||||
std::size_t z,
|
||||
bool debug_flag);
|
||||
std::size_t z,
|
||||
bool debug_flag);
|
||||
|
||||
std::byte * free_ptr() const { return free_ptr_; }
|
||||
void set_free_ptr(std::byte * x);
|
||||
|
||||
/** Reset to empty state **/
|
||||
void reset(std::size_t /*z_ignored*/) { this->clear(); }
|
||||
|
||||
void capture_object_statistics(capture_phase phase,
|
||||
ObjectStatistics * p_dest) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "ListAlloc.hpp"
|
||||
#include "ArenaAlloc.hpp"
|
||||
#include "GcStatistics.hpp"
|
||||
#include "xo/callback/UpCallbackSet.hpp"
|
||||
#include "xo/indentlog/print/array.hpp"
|
||||
|
|
@ -240,14 +240,14 @@ namespace xo {
|
|||
virtual std::byte * alloc_gc_copy(std::size_t z, const void * src) final override;
|
||||
|
||||
private:
|
||||
ListAlloc * nursery_to() const { return nursery(role::to_space); }
|
||||
ListAlloc * nursery_from() const { return nursery(role::from_space); }
|
||||
ArenaAlloc * nursery_to() const { return nursery(role::to_space); }
|
||||
ArenaAlloc * nursery_from() const { return nursery(role::from_space); }
|
||||
|
||||
ListAlloc * tenured_to() const { return tenured(role::to_space); }
|
||||
ListAlloc * tenured_from() const { return tenured(role::from_space); }
|
||||
ArenaAlloc * tenured_to() const { return tenured(role::to_space); }
|
||||
ArenaAlloc * tenured_from() const { return tenured(role::from_space); }
|
||||
|
||||
ListAlloc * nursery(role r) const { return nursery_[role2int(r)].get(); }
|
||||
ListAlloc * tenured(role r) const { return tenured_[role2int(r)].get(); }
|
||||
ArenaAlloc * nursery(role r) const { return nursery_[role2int(r)].get(); }
|
||||
ArenaAlloc * tenured(role r) const { return tenured_[role2int(r)].get(); }
|
||||
|
||||
MutationLog * mutation_log(role r) const { return mutation_log_[role2int(r)].get(); }
|
||||
|
||||
|
|
@ -314,11 +314,11 @@ namespace xo {
|
|||
/** contains allocated objects, along with unreachable garbage to be collected.
|
||||
* roles reverse after each incremental, or full, collection.
|
||||
**/
|
||||
std::array<up<ListAlloc>, role2int(role::N)> nursery_;
|
||||
std::array<up<ArenaAlloc>, role2int(role::N)> nursery_;
|
||||
/** empty space, destination for objects that survive collection.
|
||||
* roles reverse after each full collection.
|
||||
**/
|
||||
std::array<up<ListAlloc>, role2int(role::N)> tenured_;
|
||||
std::array<up<ArenaAlloc>, role2int(role::N)> tenured_;
|
||||
|
||||
/** current state of GC activity.
|
||||
* @text
|
||||
|
|
|
|||
|
|
@ -66,14 +66,14 @@ namespace xo {
|
|||
std::size_t tenured_size = config.initial_tenured_z_;
|
||||
|
||||
nursery_[role2int(role::from_space)]
|
||||
= ListAlloc::make("NA", nursery_size, 2 * nursery_size, config.debug_flag_);
|
||||
= ArenaAlloc::make("NA", nursery_size, config.debug_flag_);
|
||||
nursery_[role2int(role::to_space) ]
|
||||
= ListAlloc::make("NB", nursery_size, 2 * nursery_size, config.debug_flag_);
|
||||
= ArenaAlloc::make("NB", nursery_size, config.debug_flag_);
|
||||
|
||||
tenured_[role2int(role::from_space)]
|
||||
= ListAlloc::make("TA", tenured_size, 2 * tenured_size, config.debug_flag_);
|
||||
= ArenaAlloc::make("TA", tenured_size, config.debug_flag_);
|
||||
tenured_[role2int(role::to_space) ]
|
||||
= ListAlloc::make("TB", tenured_size, 2 * tenured_size, config.debug_flag_);
|
||||
= ArenaAlloc::make("TB", tenured_size, config.debug_flag_);
|
||||
|
||||
mutation_log_[role2int(role::from_space)] = std::make_unique<MutationLog>();
|
||||
mutation_log_[role2int(role::to_space)] = std::make_unique<MutationLog>();
|
||||
|
|
@ -444,7 +444,7 @@ namespace xo {
|
|||
void
|
||||
GC::swap_nursery()
|
||||
{
|
||||
up<ListAlloc> tmp = std::move(nursery_[role2int(role::to_space)]);
|
||||
up<ArenaAlloc> tmp = std::move(nursery_[role2int(role::to_space)]);
|
||||
nursery_[role2int(role::to_space)] = std::move(nursery_[role2int(role::from_space)]);
|
||||
nursery_[role2int(role::from_space)] = std::move(tmp);
|
||||
}
|
||||
|
|
@ -452,7 +452,7 @@ namespace xo {
|
|||
void
|
||||
GC::swap_tenured()
|
||||
{
|
||||
up<ListAlloc> tmp = std::move(tenured_[role2int(role::to_space)]);
|
||||
up<ArenaAlloc> tmp = std::move(tenured_[role2int(role::to_space)]);
|
||||
tenured_[role2int(role::to_space)] = std::move(tenured_[role2int(role::from_space)]);
|
||||
tenured_[role2int(role::from_space)] = std::move(tmp);
|
||||
}
|
||||
|
|
@ -496,9 +496,9 @@ namespace xo {
|
|||
log && log(xtag("avail_tenured_z", avail_tenured_z));
|
||||
|
||||
if (avail_tenured_z < max_promote_z) {
|
||||
ListAlloc * tenured_to = this->tenured_to();
|
||||
ArenaAlloc * tenured_to = this->tenured_to();
|
||||
|
||||
tenured_to->expand(max_promote_z, tenured_to->name() + "+");
|
||||
tenured_to->expand(max_promote_z);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -516,13 +516,13 @@ namespace xo {
|
|||
|
||||
this->swap_mutation_log();
|
||||
|
||||
ListAlloc * N_from = nursery(role::from_space);
|
||||
ArenaAlloc * N_from = nursery(role::from_space);
|
||||
log && log(xtag("nursery.from", N_from->name()), xtag("size", N_from->size()));
|
||||
ListAlloc * N_to = nursery(role::to_space);
|
||||
ArenaAlloc * N_to = nursery(role::to_space);
|
||||
log && log(xtag("nursery.to", N_to->name()), xtag("size", N_to->size()));
|
||||
ListAlloc * T_from = tenured(role::from_space);
|
||||
ArenaAlloc * T_from = tenured(role::from_space);
|
||||
log && log(xtag("tenured.from", T_from->name()), xtag("size", T_from->size()));
|
||||
ListAlloc * T_to = tenured(role::to_space);
|
||||
ArenaAlloc * T_to = tenured(role::to_space);
|
||||
log && log(xtag("tenured.to", T_to->name()), xtag("size", T_to->size()));
|
||||
|
||||
} /*swap_spaces*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue