xo-interpreter2 stack: cleanup memory reporting
This commit is contained in:
parent
64a780ce19
commit
f9e266b0fc
5 changed files with 35 additions and 9 deletions
|
|
@ -31,6 +31,12 @@ namespace xo {
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ArenaConfig with_store_header_flag(bool x) const {
|
||||||
|
ArenaConfig copy(*this);
|
||||||
|
copy.store_header_flag_ = x;
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
/** @defgroup mm-arenaconfig-instance-vars ArenaConfig members **/
|
/** @defgroup mm-arenaconfig-instance-vars ArenaConfig members **/
|
||||||
///@{
|
///@{
|
||||||
|
|
||||||
|
|
@ -44,7 +50,7 @@ namespace xo {
|
||||||
std::size_t hugepage_z_ = 2 * 1024 * 1024;
|
std::size_t hugepage_z_ = 2 * 1024 * 1024;
|
||||||
/** true to store header (8 bytes) at the beginning of each allocation.
|
/** true to store header (8 bytes) at the beginning of each allocation.
|
||||||
* necessary and sufficient to allows iterating over allocs
|
* necessary and sufficient to allows iterating over allocs
|
||||||
* present in arena
|
* present in arena.
|
||||||
**/
|
**/
|
||||||
bool store_header_flag_ = false;
|
bool store_header_flag_ = false;
|
||||||
/** configuration for per-alloc header **/
|
/** configuration for per-alloc header **/
|
||||||
|
|
|
||||||
|
|
@ -205,7 +205,7 @@ namespace xo {
|
||||||
void establish_initial_guard() noexcept;
|
void establish_initial_guard() noexcept;
|
||||||
|
|
||||||
/** checkpoint arena state. Revert to the same state with
|
/** checkpoint arena state. Revert to the same state with
|
||||||
* @ref rstore
|
* @ref restore
|
||||||
**/
|
**/
|
||||||
Checkpoint checkpoint() noexcept { return Checkpoint(free_); }
|
Checkpoint checkpoint() noexcept { return Checkpoint(free_); }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,10 @@ namespace xo {
|
||||||
*
|
*
|
||||||
* Replicates (to the extent feasible) std::unordered_map<K,V>
|
* Replicates (to the extent feasible) std::unordered_map<K,V>
|
||||||
*
|
*
|
||||||
* @tparam K key type.
|
* @tparam Key key type.
|
||||||
* @tparam V value type.
|
* @tparam Value value type.
|
||||||
|
* @tparam Hash hash function for keys
|
||||||
|
* @tparam Equal equality function for keys
|
||||||
**/
|
**/
|
||||||
template <typename Key,
|
template <typename Key,
|
||||||
typename Value,
|
typename Value,
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,7 @@ namespace xo {
|
||||||
private:
|
private:
|
||||||
size_type size_ = 0;
|
size_type size_ = 0;
|
||||||
DArena store_;
|
DArena store_;
|
||||||
|
DArena::Checkpoint zero_ckp_;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
@ -122,14 +123,16 @@ namespace xo {
|
||||||
size_type arena_align_z,
|
size_type arena_align_z,
|
||||||
DArena::value_type lo,
|
DArena::value_type lo,
|
||||||
DArena::value_type hi)
|
DArena::value_type hi)
|
||||||
: store_{cfg, page_z, arena_align_z, lo, hi}
|
: store_{cfg, page_z, arena_align_z, lo, hi},
|
||||||
|
zero_ckp_{store_.checkpoint()}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
DArenaVector<T>::DArenaVector(DArenaVector && other)
|
DArenaVector<T>::DArenaVector(DArenaVector && other)
|
||||||
: size_{other.size_}, store_{std::move(other.store_)}
|
: size_{other.size_}, store_{std::move(other.store_)}, zero_ckp_{std::move(other.zero_ckp_)}
|
||||||
{
|
{
|
||||||
other.size_ = 0;
|
other.size_ = 0;
|
||||||
|
other.zero_ckp_ = DArena::Checkpoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
@ -153,8 +156,10 @@ namespace xo {
|
||||||
{
|
{
|
||||||
this->size_ = other.size_;
|
this->size_ = other.size_;
|
||||||
this->store_ = std::move(other.store_);
|
this->store_ = std::move(other.store_);
|
||||||
|
this->zero_ckp_ = std::move(other.zero_ckp_);
|
||||||
|
|
||||||
other.size_ = 0;
|
other.size_ = 0;
|
||||||
|
other.zero_ckp_ = DArena::Checkpoint();
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
@ -166,6 +171,7 @@ namespace xo {
|
||||||
DArenaVector<T> retval;
|
DArenaVector<T> retval;
|
||||||
|
|
||||||
retval.store_ = std::move(DArena::map(cfg));
|
retval.store_ = std::move(DArena::map(cfg));
|
||||||
|
retval.zero_ckp_ = retval.store_.checkpoint();
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
@ -179,9 +185,11 @@ namespace xo {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void
|
void
|
||||||
DArenaVector<T>::resize(size_type z) {
|
DArenaVector<T>::resize(size_type z) {
|
||||||
|
// new arena size in bytes
|
||||||
|
size_t req_z = z * sizeof(T);
|
||||||
|
|
||||||
if (z > size_) {
|
if (z > size_) {
|
||||||
// expand arena to accomodate
|
// expand arena to accomodate
|
||||||
size_t req_z = z * sizeof(T);
|
|
||||||
|
|
||||||
store_.expand(req_z);
|
store_.expand(req_z);
|
||||||
|
|
||||||
|
|
@ -208,6 +216,14 @@ namespace xo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rewind to checkpoint, then reallocate.
|
||||||
|
// This is for form's sake, so that DArena considers memory
|
||||||
|
// to be 'allocated'. DArenaVector<T> doesn't care for itself,
|
||||||
|
// but this preserves expected behavior of visit_pools().
|
||||||
|
//
|
||||||
|
store_.restore(zero_ckp_);
|
||||||
|
store_.alloc(xo::reflect::typeseq::id<std::byte>(), req_z);
|
||||||
|
|
||||||
this->size_ = z;
|
this->size_ = z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,11 +33,13 @@ namespace xo {
|
||||||
control_{control_vector_type::map
|
control_{control_vector_type::map
|
||||||
(xo::mm::ArenaConfig{
|
(xo::mm::ArenaConfig{
|
||||||
.name_ = name + "-ctl",
|
.name_ = name + "-ctl",
|
||||||
.size_ = control_size(n_slot_)})},
|
.size_ = control_size(n_slot_),
|
||||||
|
.store_header_flag_ = false})},
|
||||||
slots_{slot_vector_type::map
|
slots_{slot_vector_type::map
|
||||||
(xo::mm::ArenaConfig{
|
(xo::mm::ArenaConfig{
|
||||||
.name_ = name + "-slots",
|
.name_ = name + "-slots",
|
||||||
.size_ = n_slot_ * sizeof(value_type)})}
|
.size_ = n_slot_ * sizeof(value_type),
|
||||||
|
.store_header_flag_ = false})}
|
||||||
{
|
{
|
||||||
/* here: arenas have allocated address range, but no committed memory yet */
|
/* here: arenas have allocated address range, but no committed memory yet */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue