summaryrefslogtreecommitdiffstats
path: root/src/AllocationPool.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/AllocationPool.h')
-rw-r--r--src/AllocationPool.h187
1 files changed, 0 insertions, 187 deletions
diff --git a/src/AllocationPool.h b/src/AllocationPool.h
deleted file mode 100644
index 0af56ce2f..000000000
--- a/src/AllocationPool.h
+++ /dev/null
@@ -1,187 +0,0 @@
-
-#pragma once
-
-
-
-
-
-template <class T>
-class cAllocationPool
-{
-public:
- class cStarvationCallbacks
- {
- public:
- virtual ~cStarvationCallbacks() {}
-
- /** Is called when the reserve buffer starts to be used */
- virtual void OnStartUsingReserve() = 0;
-
- /** Is called once the reserve buffer has returned to normal size */
- virtual void OnEndUsingReserve() = 0;
-
- /** Is called when the allocation pool is unable to allocate memory. Will be repeatedly
- called if it does not free sufficient memory */
- virtual void OnOutOfReserve() = 0;
- };
-
- virtual ~cAllocationPool() {}
-
- /** Allocates a pointer to T */
- virtual T * Allocate() = 0;
-
- /** Frees the pointer passed in a_ptr, invalidating it */
- virtual void Free(T * a_ptr) = 0;
-
- /** Two pools compare equal if memory allocated by one can be freed by the other */
- bool IsEqual(const cAllocationPool & a_Other) const noexcept
- {
- return ((this == &a_Other) || DoIsEqual(a_Other) || a_Other.DoIsEqual(*this));
- }
-
- friend bool operator == (const cAllocationPool & a_Lhs, const cAllocationPool & a_Rhs)
- {
- return a_Lhs.IsEqual(a_Rhs);
- }
-
- friend bool operator != (const cAllocationPool & a_Lhs, const cAllocationPool & a_Rhs)
- {
- return !a_Lhs.IsEqual(a_Rhs);
- }
-
-private:
- virtual bool DoIsEqual(const cAllocationPool & a_Other) const noexcept = 0;
-};
-
-
-
-
-
-/** Allocates memory storing unused elements in a linked list. Keeps at least NumElementsInReserve
-elements in the list unless malloc fails so that the program has a reserve to handle OOM. */
-template <class T>
-class cListAllocationPool:
- public cAllocationPool<T>
-{
-public:
-
- cListAllocationPool(std::unique_ptr<typename cAllocationPool<T>::cStarvationCallbacks> a_Callbacks, size_t a_MinElementsInReserve, size_t a_MaxElementsInReserve) :
- m_MinElementsInReserve(a_MinElementsInReserve),
- m_MaxElementsInReserve(a_MaxElementsInReserve),
- m_Callbacks(std::move(a_Callbacks))
- {
- for (size_t i = 0; i < m_MinElementsInReserve; i++)
- {
- void * space = malloc(sizeof(T));
- if (space == nullptr)
- {
- m_Callbacks->OnStartUsingReserve();
- break;
- }
- m_FreeList.push_front(space);
- }
- }
-
-
- virtual ~cListAllocationPool() override
- {
- while (!m_FreeList.empty())
- {
- free(m_FreeList.front());
- m_FreeList.pop_front();
- }
- }
-
-
- virtual T * Allocate() override
- {
- if (m_FreeList.size() <= m_MinElementsInReserve)
- {
- void * space = malloc(sizeof(T));
- if (space != nullptr)
- {
- #if defined(_MSC_VER) && !defined(NDEBUG)
- // The debugging-new that is set up using macros in Globals.h doesn't support the placement-new syntax used here.
- // Temporarily disable the macro
- #pragma push_macro("new")
- #undef new
- #endif
-
- return new(space) T;
-
- #if defined(_MSC_VER) && !defined(NDEBUG)
- // Re-enable the debugging-new macro
- #pragma pop_macro("new")
- #endif
- }
- else if (m_FreeList.size() == m_MinElementsInReserve)
- {
- m_Callbacks->OnStartUsingReserve();
- }
- else if (m_FreeList.empty())
- {
- m_Callbacks->OnOutOfReserve();
- // Try again until the memory is avalable
- return Allocate();
- }
- }
- // placement new, used to initalize the object
-
- #if defined(_MSC_VER) && !defined(NDEBUG)
- // The debugging-new that is set up using macros in Globals.h doesn't support the placement-new syntax used here.
- // Temporarily disable the macro
- #pragma push_macro("new")
- #undef new
- #endif
-
- T * ret = new (m_FreeList.front()) T;
-
- #if defined(_MSC_VER) && !defined(NDEBUG)
- // Re-enable the debugging-new macro
- #pragma pop_macro("new")
- #endif
-
- m_FreeList.pop_front();
- return ret;
- }
-
-
- virtual void Free(T * a_ptr) override
- {
- if (a_ptr == nullptr)
- {
- return;
- }
-
- a_ptr->~T(); // placement destruct.
-
- if (m_FreeList.size() >= m_MaxElementsInReserve)
- {
- free(a_ptr);
- return;
- }
-
- m_FreeList.push_front(a_ptr);
- if (m_FreeList.size() == m_MinElementsInReserve)
- {
- m_Callbacks->OnEndUsingReserve();
- }
- }
-
-private:
- /** The minimum number of elements to keep in the free list before malloc fails */
- size_t m_MinElementsInReserve;
- /** Maximum free list size before returning memory to the OS */
- size_t m_MaxElementsInReserve;
- std::list<void *> m_FreeList;
- std::unique_ptr<typename cAllocationPool<T>::cStarvationCallbacks> m_Callbacks;
-
- virtual bool DoIsEqual(const cAllocationPool<T> & a_Other) const noexcept override
- {
- return (dynamic_cast<const cListAllocationPool<T>*>(&a_Other) != nullptr);
- }
-};
-
-
-
-