xo-alloc / xo-object: utest coverage + assorted bugfixes
This commit is contained in:
parent
2048de70f3
commit
bd00826448
34 changed files with 1069 additions and 326 deletions
|
|
@ -13,36 +13,19 @@
|
|||
namespace xo {
|
||||
namespace gc {
|
||||
ArenaAlloc::ArenaAlloc(const std::string & name,
|
||||
#ifdef REDLINE_MEMORY
|
||||
std::size_t rz,
|
||||
#endif
|
||||
std::size_t z, bool debug_flag)
|
||||
{
|
||||
this->name_ = name;
|
||||
#ifdef REDLINE_MEMORY
|
||||
this->lo_ = (new std::byte [rz + z]);
|
||||
#else
|
||||
this->lo_ = (new std::byte [z]);
|
||||
#endif
|
||||
this->checkpoint_ = lo_;
|
||||
this->free_ptr_ = lo_;
|
||||
this->limit_ = lo_ + z;
|
||||
#ifdef REDLINE_MEMORY
|
||||
this->redline_z_ = rz;
|
||||
this->hi_ = limit_ + rz;
|
||||
#else
|
||||
this->hi_ = limit_;
|
||||
#endif
|
||||
this->debug_flag_ = debug_flag;
|
||||
|
||||
if (!lo_) {
|
||||
#ifdef REDLINE_MEMORY
|
||||
throw std::runtime_error(tostr("ArenaAlloc: allocation failed",
|
||||
xtag("size", rz + z)));
|
||||
#else
|
||||
throw std::runtime_error(tostr("ArenaAlloc: allocation failed",
|
||||
xtag("size", z)));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -56,24 +39,15 @@ namespace xo {
|
|||
this->checkpoint_ = nullptr;
|
||||
this->free_ptr_ = nullptr;
|
||||
this->limit_ = nullptr;
|
||||
#ifdef REDLINE_MEMORY
|
||||
this->redline_z_ = 0;
|
||||
#endif
|
||||
this->hi_ = nullptr;
|
||||
this->debug_flag_ = false;
|
||||
}
|
||||
|
||||
up<ArenaAlloc>
|
||||
ArenaAlloc::make(const std::string & name,
|
||||
#ifdef REDLINE_MEMORY
|
||||
std::size_t rz,
|
||||
#endif
|
||||
std::size_t z, bool debug_flag)
|
||||
{
|
||||
return up<ArenaAlloc>(new ArenaAlloc(name,
|
||||
#ifdef REDLINE_MEMORY
|
||||
rz,
|
||||
#endif
|
||||
z, debug_flag));
|
||||
}
|
||||
|
||||
|
|
@ -97,22 +71,36 @@ namespace xo {
|
|||
ArenaAlloc::capture_object_statistics(capture_phase phase,
|
||||
ObjectStatistics * p_dest) const
|
||||
{
|
||||
scope log(XO_DEBUG(debug_flag_),
|
||||
xtag("name", name_),
|
||||
xtag("capacity", limit_ - lo_),
|
||||
xtag("alloc", free_ptr_ - lo_),
|
||||
xtag("lo", (void*)lo_),
|
||||
xtag("free_ptr", (void*)free_ptr_));
|
||||
|
||||
using xo::reflect::TaggedPtr;
|
||||
|
||||
std::byte * p = lo_;
|
||||
|
||||
while (p < free_ptr_) {
|
||||
Object * obj = reinterpret_cast<Object *>(p);
|
||||
TaggedPtr tp = obj->self_tp();
|
||||
std::size_t z = obj->_shallow_size();
|
||||
Object * obj = reinterpret_cast<Object *>(p);
|
||||
TaggedPtr tp = obj->self_tp();
|
||||
std::size_t z = obj->_shallow_size();
|
||||
std::uint32_t id = tp.td()->id().id();
|
||||
|
||||
log && log(xtag("obj", (void*)obj),
|
||||
xtag("z", z),
|
||||
xtag("typeid", id));
|
||||
|
||||
if (p_dest->per_type_stats_v_.size() < id + 1)
|
||||
p_dest->per_type_stats_v_.resize(id + 1);
|
||||
|
||||
PerObjectTypeStatistics & dest = p_dest->per_type_stats_v_.at(id);
|
||||
|
||||
dest.td_ = tp.td();
|
||||
|
||||
log && log(xtag("td", tp.td()->short_name()));
|
||||
|
||||
switch (phase) {
|
||||
case capture_phase::sab:
|
||||
++dest.scanned_n_;
|
||||
|
|
@ -130,6 +118,11 @@ namespace xo {
|
|||
assert(p == free_ptr_);
|
||||
}
|
||||
|
||||
const std::string &
|
||||
ArenaAlloc::name() const {
|
||||
return name_;
|
||||
}
|
||||
|
||||
std::size_t
|
||||
ArenaAlloc::size() const {
|
||||
return limit_ - lo_;
|
||||
|
|
@ -167,15 +160,17 @@ namespace xo {
|
|||
return free_ptr_ - checkpoint_;
|
||||
}
|
||||
|
||||
bool
|
||||
ArenaAlloc::debug_flag() const
|
||||
{
|
||||
return debug_flag_;
|
||||
}
|
||||
|
||||
void
|
||||
ArenaAlloc::clear()
|
||||
{
|
||||
this->set_free_ptr(lo_);
|
||||
#ifdef REDLINE_MEMORY
|
||||
this->limit_ = hi_ - redline_z_;
|
||||
#else
|
||||
this->limit_ = hi_;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -204,7 +199,7 @@ namespace xo {
|
|||
|
||||
std::byte * retval = this->free_ptr_;
|
||||
|
||||
log && log(xtag("self", name_), xtag("z0", z0), xtag("+pad", dz), xtag("z1", z1));
|
||||
log && log(xtag("self", name_), xtag("z0", z0), xtag("+pad", dz), xtag("z1", z1), xtag("avail", this->available()));
|
||||
|
||||
if (free_ptr_ + z1 > limit_) {
|
||||
return nullptr;
|
||||
|
|
@ -215,13 +210,6 @@ namespace xo {
|
|||
return retval;
|
||||
}
|
||||
|
||||
#ifdef REDLINE_MEMORY
|
||||
void
|
||||
ArenaAlloc::release_redline_memory() {
|
||||
this->limit_ = this->hi_;
|
||||
}
|
||||
#endif
|
||||
|
||||
} /*namespace gc*/
|
||||
} /*namespace xo*/
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue