77#ifndef NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
78#define NANOVDB_HOSTBUFFER_H_HAS_BEEN_INCLUDED
80#include "../NanoVDB.h"
86#include <unordered_set>
91#define checkPtr(ptr, msg) \
93 ptrAssert((ptr), (msg), __FILE__, __LINE__); \
98template<
typename BufferT>
117 std::shared_ptr<Pool> mPool;
121#if defined(DEBUG) || defined(_DEBUG)
124 if (ptr ==
nullptr) {
136 static inline void ptrAssert(
void*,
const char*,
const char*,
int,
bool =
true)
210 bool isEmpty()
const {
return !mPool || mSize == 0 || mData ==
nullptr; }
275 if (
mData ==
nullptr) {
276 throw std::runtime_error(
"Pool::Pool malloc failed");
281 throw std::runtime_error(
"Pool::Pool: external memory buffer is not aligned to " +
283 " bytes.\nHint: use nanovdb::alignPtr or std::aligned_alloc (C++17 only)");
318 std::stringstream
ss;
319 ss <<
"HostBuffer::Pool: insufficient memory\n"
321 <<
"-bytes alignment from a pool with "
323 <<
" bytes are used by " <<
mRegister.
size() <<
" other buffer(s). "
324 <<
"Pool is " << (
mManaged ?
"internally" :
"externally") <<
" managed.\n";
326 throw std::runtime_error(
ss.str());
328 buffer->mSize =
size;
329 const std::lock_guard<std::mutex> lock(
mMutex);
338 const std::lock_guard<std::mutex> lock(
mMutex);
345 const std::lock_guard<std::mutex> lock(
mMutex);
354 buffer->mPool.
reset();
356 buffer->mData =
nullptr;
371 throw std::runtime_error(
"Pool::resize: external memory buffer is not aligned to " +
375 if (memUsage >
size) {
376 throw std::runtime_error(
"Pool::resize: insufficient memory");
388 if (
data ==
nullptr) {
389 throw std::runtime_error(
"Pool::resize: allocation failed");
430 static void* realloc(
void*
const origData,
460 mPool = std::make_shared<Pool>(
size);
461 mData = mPool->mFree;
462 mPool->mRegister.insert(
this);
463 mPool->mFree +=
size;
469 if (mPool && mSize != 0) {
470 mPool->replace(&
other,
this);
474 other.mData =
nullptr;
480 throw std::runtime_error(
"HostBuffer: invalid buffer size");
499 if (mPool && mSize != 0) {
500 mPool->replace(&
other,
this);
504 other.mData =
nullptr;
510 return mPool ? mPool->mSize : 0u;
515 return mPool ? mPool->usage(): 0u;
520 return mPool ? mPool->mManaged :
false;
525 return mPool ? mPool->isFull() :
false;
531 throw std::runtime_error(
"HostBuffer: invalid pool size");
537 buffer.mData =
nullptr;
544 throw std::runtime_error(
"HostBuffer: invalid buffer size");
555 if (
pool ==
nullptr || !
pool->mPool) {
556 buffer.mPool = std::make_shared<Pool>(
bufferSize);
558 buffer.mPool =
pool->mPool;
576 if (this->
size()>0) {
577 throw std::runtime_error(
"HostBuffer: only empty buffers can call reset");
580 throw std::runtime_error(
"HostBuffer: this buffer contains no pool to reset");
588 throw std::runtime_error(
"HostBuffer: this buffer contains no pool to resize");
static void ptrAssert(void *, const char *, const char *, int, bool=true)
Definition CudaDeviceBuffer.h:44
#define NANOVDB_DATA_ALIGNMENT
Definition NanoVDB.h:137
Definition DenseGrid.h:402
uint64_t size() const
Returns the size in bytes of the raw memory buffer managed by this DenseGridHandle's allocator.
Definition DenseGrid.h:440
void reset()
Definition DenseGrid.h:424
This is a buffer that contains a shared or private pool to either externally or internally managed ho...
Definition HostBuffer.h:115
~HostBuffer()
Custom descructor.
Definition HostBuffer.h:149
const uint8_t * data() const
Retuns a pointer to the raw memory buffer managed by this allocator.
Definition HostBuffer.h:191
HostBuffer(const HostBuffer &)=delete
Disallow copy-construction.
HostBuffer(uint64_t bufferSize=0)
Return a full buffer or an empty buffer.
Definition HostBuffer.h:457
HostBuffer & operator=(HostBuffer &&other)
Move copy assignment operation.
Definition HostBuffer.h:491
uint64_t bufferSize() const
Returns the size in bytes associated with this buffer.
Definition HostBuffer.h:197
bool empty() const
Definition HostBuffer.h:211
static HostBuffer createFull(uint64_t bufferSize, void *data=nullptr)
Return a full buffer which satisfies: buffer.size == bufferSize, buffer.poolSize() == bufferSize,...
Definition HostBuffer.h:541
uint64_t poolSize() const
Returns the size in bytes of the memory pool shared with this instance.
Definition HostBuffer.h:508
uint64_t size() const
Definition HostBuffer.h:198
void init(uint64_t bufferSize, void *data=nullptr)
Initialize as a full buffer with the specified size. If data is NULL the memory is internally allocat...
Definition HostBuffer.h:477
HostBuffer & operator=(const HostBuffer &)=delete
Disallow copy assignment operation.
uint64_t poolUsage() const
Total number of bytes from the pool currently in use by buffers.
Definition HostBuffer.h:513
uint8_t * data()
Definition HostBuffer.h:192
bool isPool() const
Return true if this is a pool, i.e. an empty buffer with a nonempty internal pool,...
Definition HostBuffer.h:216
bool isManaged() const
Return true if memory is managed (using std::malloc and std:free) by the shared pool in this buffer....
Definition HostBuffer.h:518
static HostBuffer create(uint64_t bufferSize, const HostBuffer *pool=nullptr)
Return a buffer with bufferSize bytes managed by the specified memory pool. If none is provided,...
Definition HostBuffer.h:552
void clear()
Clear this buffer so it is empty.
Definition HostBuffer.h:564
bool isEmpty() const
Returns true if this buffer has no memory associated with it.
Definition HostBuffer.h:210
void reset()
Clears all existing buffers that are registered against the memory pool and resets the pool so it can...
Definition HostBuffer.h:574
bool isFull() const
Return true if the pool exists, is nonempty but has no more available memory.
Definition HostBuffer.h:523
void resizePool(uint64_t poolSize, void *data=nullptr)
resize the pool size. It will attempt to resize the existing memory block, but if that fails a deep c...
Definition HostBuffer.h:585
static HostBuffer createPool(uint64_t poolSize, void *data=nullptr)
Return a pool buffer which satisfies: buffer.size == 0, buffer.poolSize() == poolSize,...
Definition HostBuffer.h:528
Type Min(Type a, Type b)
Definition NanoVDB.h:758
static uint64_t alignmentPadding(const void *p)
return the smallest number of bytes that when added to the specified pointer results in an aligned po...
Definition NanoVDB.h:510
Definition HostBuffer.h:100
static const bool hasDeviceDual
Definition HostBuffer.h:101
Definition HostBuffer.h:255
std::unordered_set< HostBuffer * > HashTableT
Definition HostBuffer.h:256
void resize(uint64_t size, void *data=nullptr)
Resize this Pool and update registered buffers as needed. If data is no NULL it is used as externally...
Definition HostBuffer.h:364
uint64_t usage() const
Return the total number of bytes used from this Pool by buffers.
Definition HostBuffer.h:310
void replace(HostBuffer *buffer1, HostBuffer *buffer2)
Replaces buffer1 with buffer2 in the register.
Definition HostBuffer.h:343
Pool(uint64_t size=0, void *data=nullptr)
External memory ctor.
Definition HostBuffer.h:266
uint64_t mSize
Definition HostBuffer.h:261
Pool(const Pool &)=delete
Disallow copy-construction.
void add(HostBuffer *buffer, uint64_t size)
Allocate a buffer of the specified size and add it to the register.
Definition HostBuffer.h:313
void remove(HostBuffer *buffer)
Remove the specified buffer from the register.
Definition HostBuffer.h:336
uint8_t * mFree
Definition HostBuffer.h:260
Pool & operator=(const Pool &&)=delete
Disallow move assignment operation.
uint8_t * mData
Definition HostBuffer.h:259
std::mutex mMutex
Definition HostBuffer.h:257
Pool(const Pool &&)=delete
Disallow move-construction.
HashTableT mRegister
Definition HostBuffer.h:258
uint64_t mPadding
Definition HostBuffer.h:262
Pool & operator=(const Pool &)=delete
Disallow copy assignment operation.
void reset()
Reset the register and all its buffers.
Definition HostBuffer.h:351
~Pool()
Custom destructor.
Definition HostBuffer.h:289
bool isFull() const
Return true is all the memory in this pool is in use.
Definition HostBuffer.h:412
bool mManaged
Definition HostBuffer.h:263