mirror of
https://github.com/matrix-construct/construct
synced 2024-11-29 10:12:39 +01:00
ircd::ios: Move descriptor stats into structure.
This commit is contained in:
parent
79065f805b
commit
289aca0c4a
3 changed files with 94 additions and 29 deletions
|
@ -68,6 +68,8 @@ namespace ircd
|
||||||
struct ircd::ios::descriptor
|
struct ircd::ios::descriptor
|
||||||
:instance_list<descriptor>
|
:instance_list<descriptor>
|
||||||
{
|
{
|
||||||
|
struct stats;
|
||||||
|
|
||||||
static uint64_t ids;
|
static uint64_t ids;
|
||||||
|
|
||||||
static void *default_allocator(handler &, const size_t &);
|
static void *default_allocator(handler &, const size_t &);
|
||||||
|
@ -75,15 +77,7 @@ struct ircd::ios::descriptor
|
||||||
|
|
||||||
string_view name;
|
string_view name;
|
||||||
uint64_t id {++ids};
|
uint64_t id {++ids};
|
||||||
uint64_t calls {0};
|
std::unique_ptr<struct stats> stats;
|
||||||
uint64_t faults {0};
|
|
||||||
uint64_t allocs {0};
|
|
||||||
uint64_t alloc_bytes{0};
|
|
||||||
uint64_t frees {0};
|
|
||||||
uint64_t free_bytes{0};
|
|
||||||
uint64_t slice_total {0};
|
|
||||||
uint64_t slice_last {0};
|
|
||||||
|
|
||||||
std::function<void *(handler &, const size_t &)> allocator;
|
std::function<void *(handler &, const size_t &)> allocator;
|
||||||
std::function<void (handler &, void *const &, const size_t &)> deallocator;
|
std::function<void (handler &, void *const &, const size_t &)> deallocator;
|
||||||
bool continuation;
|
bool continuation;
|
||||||
|
@ -98,6 +92,23 @@ struct ircd::ios::descriptor
|
||||||
~descriptor() noexcept;
|
~descriptor() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ircd::ios::descriptor::stats
|
||||||
|
{
|
||||||
|
uint64_t calls {0};
|
||||||
|
uint64_t faults {0};
|
||||||
|
uint64_t allocs {0};
|
||||||
|
uint64_t alloc_bytes{0};
|
||||||
|
uint64_t frees {0};
|
||||||
|
uint64_t free_bytes{0};
|
||||||
|
uint64_t slice_total {0};
|
||||||
|
uint64_t slice_last {0};
|
||||||
|
|
||||||
|
stats &operator+=(const stats &) &;
|
||||||
|
|
||||||
|
stats();
|
||||||
|
~stats() noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
struct ircd::ios::handler
|
struct ircd::ios::handler
|
||||||
{
|
{
|
||||||
static thread_local handler *current;
|
static thread_local handler *current;
|
||||||
|
|
70
ircd/ios.cc
70
ircd/ios.cc
|
@ -129,6 +129,7 @@ ircd::ios::descriptor::descriptor(const string_view &name,
|
||||||
const decltype(deallocator) &deallocator,
|
const decltype(deallocator) &deallocator,
|
||||||
const bool &continuation)
|
const bool &continuation)
|
||||||
:name{name}
|
:name{name}
|
||||||
|
,stats{std::make_unique<struct stats>()}
|
||||||
,allocator{allocator}
|
,allocator{allocator}
|
||||||
,deallocator{deallocator}
|
,deallocator{deallocator}
|
||||||
,continuation{continuation}
|
,continuation{continuation}
|
||||||
|
@ -157,6 +158,34 @@ ircd::ios::descriptor::default_allocator(handler &handler,
|
||||||
return ::operator new(size);
|
return ::operator new(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// descriptor::stats
|
||||||
|
//
|
||||||
|
|
||||||
|
ircd::ios::descriptor::stats::stats()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::ios::descriptor::stats::~stats()
|
||||||
|
noexcept
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::ios::descriptor::stats &
|
||||||
|
ircd::ios::descriptor::stats::operator+=(const stats &o)
|
||||||
|
&
|
||||||
|
{
|
||||||
|
calls += o.calls;
|
||||||
|
faults += o.faults;
|
||||||
|
allocs += o.allocs;
|
||||||
|
alloc_bytes += o.alloc_bytes;
|
||||||
|
frees += o.frees;
|
||||||
|
free_bytes += o.free_bytes;
|
||||||
|
slice_total += o.slice_total;
|
||||||
|
slice_last += o.slice_last;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// handler
|
// handler
|
||||||
//
|
//
|
||||||
|
@ -169,15 +198,18 @@ ircd::ios::handler::fault(handler *const &handler)
|
||||||
{
|
{
|
||||||
assert(handler && handler->descriptor);
|
assert(handler && handler->descriptor);
|
||||||
auto &descriptor(*handler->descriptor);
|
auto &descriptor(*handler->descriptor);
|
||||||
++descriptor.faults;
|
|
||||||
bool ret(false);
|
|
||||||
|
|
||||||
|
assert(descriptor.stats);
|
||||||
|
auto &stats(*descriptor.stats);
|
||||||
|
++stats.faults;
|
||||||
|
|
||||||
|
bool ret(false);
|
||||||
// leave() isn't called if we return false so the tsc counter
|
// leave() isn't called if we return false so the tsc counter
|
||||||
// needs to be tied off here instead.
|
// needs to be tied off here instead.
|
||||||
if(!ret)
|
if(!ret)
|
||||||
{
|
{
|
||||||
descriptor.slice_last = cycles() - handler->slice_start;
|
stats.slice_last = cycles() - handler->slice_start;
|
||||||
descriptor.slice_total += descriptor.slice_last;
|
stats.slice_total += stats.slice_last;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -188,8 +220,12 @@ ircd::ios::handler::leave(handler *const &handler)
|
||||||
{
|
{
|
||||||
assert(handler && handler->descriptor);
|
assert(handler && handler->descriptor);
|
||||||
auto &descriptor(*handler->descriptor);
|
auto &descriptor(*handler->descriptor);
|
||||||
descriptor.slice_last = cycles() - handler->slice_start;
|
|
||||||
descriptor.slice_total += descriptor.slice_last;
|
assert(descriptor.stats);
|
||||||
|
auto &stats(*descriptor.stats);
|
||||||
|
stats.slice_last = cycles() - handler->slice_start;
|
||||||
|
stats.slice_total += stats.slice_last;
|
||||||
|
|
||||||
assert(handler::current == handler);
|
assert(handler::current == handler);
|
||||||
handler::current = nullptr;
|
handler::current = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -199,7 +235,11 @@ ircd::ios::handler::enter(handler *const &handler)
|
||||||
{
|
{
|
||||||
assert(handler && handler->descriptor);
|
assert(handler && handler->descriptor);
|
||||||
auto &descriptor(*handler->descriptor);
|
auto &descriptor(*handler->descriptor);
|
||||||
++descriptor.calls;
|
|
||||||
|
assert(descriptor.stats);
|
||||||
|
auto &stats(*descriptor.stats);
|
||||||
|
++stats.calls;
|
||||||
|
|
||||||
assert(!handler::current);
|
assert(!handler::current);
|
||||||
handler::current = handler;
|
handler::current = handler;
|
||||||
handler->slice_start = cycles();
|
handler->slice_start = cycles();
|
||||||
|
@ -220,9 +260,13 @@ ircd::ios::handler::deallocate(handler *const &handler,
|
||||||
{
|
{
|
||||||
assert(handler && handler->descriptor);
|
assert(handler && handler->descriptor);
|
||||||
auto &descriptor(*handler->descriptor);
|
auto &descriptor(*handler->descriptor);
|
||||||
|
|
||||||
descriptor.deallocator(*handler, ptr, size);
|
descriptor.deallocator(*handler, ptr, size);
|
||||||
descriptor.free_bytes += size;
|
|
||||||
++descriptor.frees;
|
assert(descriptor.stats);
|
||||||
|
auto &stats(*descriptor.stats);
|
||||||
|
stats.free_bytes += size;
|
||||||
|
++stats.frees;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
|
@ -231,7 +275,11 @@ ircd::ios::handler::allocate(handler *const &handler,
|
||||||
{
|
{
|
||||||
assert(handler && handler->descriptor);
|
assert(handler && handler->descriptor);
|
||||||
auto &descriptor(*handler->descriptor);
|
auto &descriptor(*handler->descriptor);
|
||||||
descriptor.alloc_bytes += size;
|
|
||||||
++descriptor.allocs;
|
assert(descriptor.stats);
|
||||||
|
auto &stats(*descriptor.stats);
|
||||||
|
stats.alloc_bytes += size;
|
||||||
|
++stats.allocs;
|
||||||
|
|
||||||
return descriptor.allocator(*handler, size);
|
return descriptor.allocator(*handler, size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -830,13 +830,14 @@ console_cmd__ios(opt &out, const string_view &line)
|
||||||
{
|
{
|
||||||
out << std::left << std::setw(3) << "ID"
|
out << std::left << std::setw(3) << "ID"
|
||||||
<< " " << std::left << std::setw(48) << "NAME"
|
<< " " << std::left << std::setw(48) << "NAME"
|
||||||
<< " " << std::right << std::setw(6) << "FAULTS"
|
|
||||||
<< " " << std::right << std::setw(10) << "CALLS"
|
<< " " << std::right << std::setw(10) << "CALLS"
|
||||||
<< " " << std::right << std::setw(15) << "CYCLES"
|
<< " " << std::right << std::setw(15) << "TOTAL CYCLES"
|
||||||
|
<< " " << std::right << std::setw(15) << "LAST CYCLES"
|
||||||
<< " " << std::right << std::setw(10) << "ALLOCS"
|
<< " " << std::right << std::setw(10) << "ALLOCS"
|
||||||
<< " " << std::right << std::setw(10) << "FREES"
|
<< " " << std::right << std::setw(10) << "FREES"
|
||||||
<< " " << std::right << std::setw(26) << "ALLOCATED"
|
<< " " << std::right << std::setw(26) << "ALLOCATED"
|
||||||
<< " " << std::right << std::setw(26) << "FREED"
|
<< " " << std::right << std::setw(26) << "FREED"
|
||||||
|
<< " " << std::right << std::setw(6) << "FAULTS"
|
||||||
<< std::endl
|
<< std::endl
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -844,16 +845,21 @@ console_cmd__ios(opt &out, const string_view &line)
|
||||||
{
|
{
|
||||||
assert(descriptor);
|
assert(descriptor);
|
||||||
const auto &d(*descriptor);
|
const auto &d(*descriptor);
|
||||||
|
|
||||||
|
assert(d.stats);
|
||||||
|
const auto &s(*d.stats);
|
||||||
|
|
||||||
thread_local char pbuf[64];
|
thread_local char pbuf[64];
|
||||||
out << std::left << std::setw(3) << d.id
|
out << std::left << std::setw(3) << d.id
|
||||||
<< " " << std::left << std::setw(48) << d.name
|
<< " " << std::left << std::setw(48) << d.name
|
||||||
<< " " << std::right << std::setw(6) << d.faults
|
<< " " << std::right << std::setw(10) << s.calls
|
||||||
<< " " << std::right << std::setw(10) << d.calls
|
<< " " << std::right << std::setw(15) << s.slice_total
|
||||||
<< " " << std::right << std::setw(15) << d.slice_total
|
<< " " << std::right << std::setw(15) << s.slice_last
|
||||||
<< " " << std::right << std::setw(10) << d.allocs
|
<< " " << std::right << std::setw(10) << s.allocs
|
||||||
<< " " << std::right << std::setw(10) << d.frees
|
<< " " << std::right << std::setw(10) << s.frees
|
||||||
<< " " << std::right << std::setw(26) << pretty(iec(d.alloc_bytes))
|
<< " " << std::right << std::setw(26) << pretty(iec(s.alloc_bytes))
|
||||||
<< " " << std::right << std::setw(26) << pretty(iec(d.free_bytes))
|
<< " " << std::right << std::setw(26) << pretty(iec(s.free_bytes))
|
||||||
|
<< " " << std::right << std::setw(6) << s.faults
|
||||||
<< std::endl
|
<< std::endl
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue