xo-alloc2: + Allocator.last_error() for last-error reporting.

This commit is contained in:
Roland Conybeare 2025-12-12 13:26:09 -05:00
commit 1b1a2b5eab
5 changed files with 40 additions and 33 deletions

View file

@ -30,11 +30,15 @@ namespace xo {
using value_type = std::byte*;
AllocatorError() = default;
explicit AllocatorError(error err) : error_{err} {}
explicit AllocatorError(error err,
uint32_t seq) : error_{err},
error_seq_{seq} {}
AllocatorError(error err,
uint32_t seq,
size_type req_z,
size_type com_z,
size_type rsv_z) : error_{err},
error_seq_{seq},
request_z_{req_z},
committed_z_{com_z},
reserved_z_{rsv_z} {}
@ -42,6 +46,10 @@ namespace xo {
/** error code **/
error error_ = error::none;
/** sequence# of this error.
* Each error event within an allocator gets next sequence number
**/
uint32_t error_seq_ = 0;
/** reqeust size assoc'd with errror **/
size_type request_z_ = 0;
/** committed allocator memory at time of error **/
@ -104,6 +112,9 @@ namespace xo {
**/
virtual bool contains(Copaque d, const void * p) const noexcept = 0;
/** report last error **/
virtual AllocatorError last_error(Copaque d) const noexcept = 0;
/** expand committed space in arena @p d
* to size at least @p z
* In practice will round up to a multiple of hugepage size (2MB)

View file

@ -38,6 +38,7 @@ namespace xo {
[[noreturn]] size_type available(Copaque) const noexcept override { _fatal(); }
[[noreturn]] size_type allocated(Copaque) const noexcept override { _fatal(); }
[[noreturn]] bool contains(Copaque, const void *) const noexcept override { _fatal(); }
[[noreturn]] AllocatorError last_error(Copaque) const noexcept override { _fatal(); }
[[noreturn]] bool expand(Opaque, std::size_t) const noexcept override { _fatal(); }
[[noreturn]] std::byte * alloc(Opaque, std::size_t) const override { _fatal(); }

View file

@ -37,6 +37,7 @@ namespace xo {
static size_type available(const DArena &) noexcept;
static size_type allocated(const DArena &) noexcept;
static bool contains(const DArena &, const void * p) noexcept;
static AllocatorError last_error(const DArena &) noexcept;
/** expand committed space in arena @p d
* to size at least @p z

View file

@ -24,42 +24,29 @@ namespace xo {
static DRepr & _dcast(Opaque d) { return *(DRepr *)d; }
// from AAllocator
// const methods
int32_t _typeseq() const noexcept override { return s_typeseq; }
const std::string & name(Copaque d) const noexcept override {
return Impl::name(_dcast(d));
}
size_type reserved(Copaque d) const noexcept override {
return Impl::reserved(_dcast(d));
}
size_type size(Copaque d) const noexcept override {
return Impl::size(_dcast(d));
}
size_type committed(Copaque d) const noexcept override {
return Impl::committed(_dcast(d));
}
size_type available(Copaque d) const noexcept override {
return I::available(_dcast(d));
}
size_type allocated(Copaque d) const noexcept override {
return I::allocated(_dcast(d));
}
const std::string & name(Copaque d) const noexcept override { return I::name(_dcast(d)); }
size_type reserved(Copaque d) const noexcept override { return I::reserved(_dcast(d)); }
size_type size(Copaque d) const noexcept override { return I::size(_dcast(d)); }
size_type committed(Copaque d) const noexcept override { return I::committed(_dcast(d)); }
size_type available(Copaque d) const noexcept override { return I::available(_dcast(d)); }
size_type allocated(Copaque d) const noexcept override { return I::allocated(_dcast(d)); }
bool contains(Copaque d, const void * p) const noexcept override {
return Impl::contains(_dcast(d), p);
return I::contains(_dcast(d), p);
}
AllocatorError last_error(Copaque d) const noexcept override { return I::last_error(_dcast(d)); }
bool expand(Opaque d, std::size_t z) const noexcept override {
return Impl::expand(_dcast(d), z);
}
std::byte * alloc(Opaque d, std::size_t z) const override {
return Impl::alloc(*(DRepr*)d, z);
}
void clear(Opaque d) const override {
return Impl::clear(*(DRepr*)d);
}
void destruct_data(Opaque d) const override {
return Impl::destruct_data(*(DRepr*)d);
}
// non-const methods
bool expand(Opaque d,
std::size_t z) const noexcept override { return I::expand(_dcast(d), z); }
std::byte * alloc(Opaque d,
std::size_t z) const override { return I::alloc(_dcast(d), z); }
void clear(Opaque d) const override { return I::clear(_dcast(d)); }
void destruct_data(Opaque d) const override { return I::destruct_data(_dcast(d)); }
private:
using I = Impl;