Skip to content

Commit

Permalink
PtrCaster
Browse files Browse the repository at this point in the history
  • Loading branch information
morzhovets committed Jan 5, 2025
1 parent 42a646e commit 94d8766
Showing 1 changed file with 13 additions and 10 deletions.
23 changes: 13 additions & 10 deletions include/momo/MemPool.h
Original file line number Diff line number Diff line change
Expand Up @@ -894,48 +894,51 @@ namespace internal
{
if (mLazyHead != nullptr)
{
void* block = mLazyHead.exchange(nullptr);
std::byte* block = mLazyHead.exchange(nullptr);
if (block != nullptr)
{
pvFlushDeallocate(MemCopyer::FromBuffer<void*>(block));
return static_cast<ResObject*>(block);
pvFlushDeallocate(MemCopyer::FromBuffer<std::byte*>(block));
return PtrCaster::FromBytePtr<ResObject>(block);
}
}
return mMemPool.template Allocate<ResObject>();
}

void Deallocate(void* block) noexcept
template<typename Object>
void Deallocate(Object* ptr) noexcept
{
if (mLazyHead != nullptr)
pvFlushDeallocate(mLazyHead.exchange(nullptr));
mMemPool.Deallocate(block);
mMemPool.Deallocate(ptr);
}

void DeallocateLazy(void* block) noexcept
template<typename Object>
void DeallocateLazy(Object* ptr) noexcept
{
std::byte* block = PtrCaster::ToBytePtr(ptr);
while (true)
{
void* lazyHead = mLazyHead;
std::byte* lazyHead = mLazyHead;
MemCopyer::ToBuffer(lazyHead, block);
if (mLazyHead.compare_exchange_weak(lazyHead, block))
break;
}
}

private:
void pvFlushDeallocate(void* block) noexcept
void pvFlushDeallocate(std::byte* block) noexcept
{
while (block != nullptr)
{
void* nextBlock = MemCopyer::FromBuffer<void*>(block);
std::byte* nextBlock = MemCopyer::FromBuffer<std::byte*>(block);
mMemPool.Deallocate(block);
block = nextBlock;
}
}

private:
MemPool mMemPool;
std::atomic<void*> mLazyHead;
std::atomic<std::byte*> mLazyHead;
};

template<conceptMemManager TBaseMemManager, conceptMemPoolParams TMemPoolParams>
Expand Down

0 comments on commit 94d8766

Please sign in to comment.