11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
28PROMEKI_NAMESPACE_BEGIN
106 using List = ::promeki::List<Buffer>;
112 static size_t getPageSize();
115 static const size_t DefaultAlign;
135 Buffer(
size_t sz,
size_t an = DefaultAlign,
const MemSpace &ms = MemSpace::Default)
136 : _d(makeBufferImpl(ms, sz, an)) {}
153 static Buffer wrapHost(
void *p,
size_t sz,
size_t an = 0,
const MemSpace &ms = MemSpace::Default);
184 static Buffer wrapDmabuf(
int fd,
size_t sz,
size_t an = 0);
192 static Buffer fromImpl(BufferImpl *impl) {
194 if (impl !=
nullptr) b._d = BufferImplPtr::takeOwnership(impl);
216 static Result<Buffer> fromHex(
const String &hex);
231 String toHex(
const String &sep)
const;
234 String toHex()
const;
242 bool isValid()
const {
return _d.isValid() && _d->allocSize() > 0; }
264 if (!_d.isValid())
return nullptr;
265 void *base = _d->mappedHostData();
266 if (base ==
nullptr)
return nullptr;
267 return static_cast<uint8_t *
>(base) + _d->shift();
271 const void *data()
const {
272 if (!_d.isValid())
return nullptr;
273 const void *base = _d->mappedHostData();
274 if (base ==
nullptr)
return nullptr;
275 return static_cast<const uint8_t *
>(base) + _d->shift();
288 if (!_d.isValid())
return nullptr;
289 return _d->mappedHostData();
293 const void *odata()
const {
294 if (!_d.isValid())
return nullptr;
295 return _d->mappedHostData();
304 size_t size()
const {
return _d.isValid() ? _d->logicalSize() : 0; }
314 void setSize(
size_t s)
const {
315 assert(s <= availSize());
316 if (_d.isValid()) _d->setLogicalSize(s);
327 size_t availSize()
const {
328 if (!_d.isValid())
return 0;
329 size_t total = _d->allocSize();
330 size_t shift = _d->shift();
331 return shift > total ? 0 : total - shift;
335 size_t allocSize()
const {
return _d.isValid() ? _d->allocSize() : 0; }
338 size_t align()
const {
return _d.isValid() ? _d->align() : 0; }
346 MemSpace memSpace()
const {
return _d.isValid() ? _d->memSpace() : MemSpace(MemSpace::System); }
359 void shiftData(
size_t bytes) {
360 assert(_d.isValid());
361 assert(bytes <= _d->allocSize());
362 _d.modify()->setShift(bytes);
368 size_t shift()
const {
return _d.isValid() ? _d->shift() : 0; }
376 bool isMapped(MemDomain domain = MemDomain::Host)
const {
377 return _d.isValid() && _d->isMapped(domain);
385 bool isHostAccessible()
const {
return isMapped(MemDomain::Host); }
398 BufferRequest mapAcquire(MemDomain domain = MemDomain::Host, MapFlags flags = MapFlags::Read) {
399 if (!_d.isValid())
return BufferRequest::resolved(Error::Invalid);
400 return _d.modify()->mapAcquire(domain, flags);
413 BufferRequest mapRelease(MemDomain domain = MemDomain::Host) {
414 if (!_d.isValid())
return BufferRequest::resolved(Error::Invalid);
415 return _d.modify()->mapRelease(domain);
428 Error fill(
char value)
const {
429 if (!_d.isValid())
return Error::Invalid;
430 return _d.modify()->fill(value, _d->shift(), availSize());
445 Error copyFrom(
const void *src,
size_t bytes,
size_t offset = 0)
const;
469 BufferRequest copyTo(Buffer &dst,
size_t bytes,
size_t srcOffset = 0,
size_t dstOffset = 0)
const;
483 void ensureExclusive() {
484 if (!_d.isValid())
return;
485 if (_d.referenceCount() < 2)
return;
486 if (!_d->canClone())
return;
499 Error ensureExclusiveError() {
500 if (!_d.isValid())
return Error::Invalid;
501 if (_d.referenceCount() < 2)
return Error::Ok;
502 if (!_d->canClone())
return Error::NotSupported;
508 bool isExclusive()
const {
return _d.isValid() && _d.referenceCount() < 2; }
519 bool isShared()
const {
return _d.isValid() && _d.referenceCount() >= 2; }
542 [[nodiscard]] Error seal()
const {
543 if (!_d.isValid())
return Error::Invalid;
556 size_t residentBytes()
const {
557 return _d.isValid() ? _d->residentBytes() : 0;
571 bool isCowBacked()
const {
572 return _d.isValid() && _d->isCowBacked();
582 const BufferImplPtr &impl()
const {
return _d; }
593 int dmabufFd()
const;
613 bool operator==(
const Buffer &o)
const;
616 bool operator!=(
const Buffer &o)
const {
return !(*
this == o); }
619 explicit operator bool()
const {
return _d.isValid(); }
628 mutable BufferImplPtr _d;