diff --git a/libs/ui/canvas/kis_update_info.h b/libs/ui/canvas/kis_update_info.h --- a/libs/ui/canvas/kis_update_info.h +++ b/libs/ui/canvas/kis_update_info.h @@ -28,12 +28,53 @@ #include "kis_ui_types.h" +#include + +template +class KisPool { + boost::lockfree::queue m_queue; + +public: + KisPool(size_t capacity) : m_queue(capacity) { + } + + void *alloc(size_t size) { + Q_ASSERT(size == sizeof(T)); + void *ptr; + if (m_queue.pop(ptr)) { + return ptr; + } + ptr = ::operator new(size); + if (ptr != nullptr) { + return ptr; + } else { + throw new std::bad_alloc; + } + } + + void free(void *memory) { + if (!m_queue.bounded_push(memory)) { + ::operator delete(memory); + } + } +}; + class KRITAUI_EXPORT KisUpdateInfo : public KisShared { + static KisPool s_pool; + public: KisUpdateInfo(); virtual ~KisUpdateInfo(); + void *operator new(size_t size) { + return s_pool.alloc(size); + } + + void operator delete(void *memory) { + s_pool.free(memory); + } + virtual QRect dirtyViewportRect(); virtual QRect dirtyImageRect() const = 0; virtual int levelOfDetail() const = 0; @@ -66,9 +107,19 @@ class KisOpenGLUpdateInfo : public KisUpdateInfo { + static KisPool s_pool; + public: KisOpenGLUpdateInfo(ConversionOptions options); + void *operator new(size_t size) { + return s_pool.alloc(size); + } + + void operator delete(void *memory) { + s_pool.free(memory); + } + KisTextureTileUpdateInfoSPList tileList; QRect dirtyViewportRect() override; diff --git a/libs/ui/canvas/kis_update_info.cpp b/libs/ui/canvas/kis_update_info.cpp --- a/libs/ui/canvas/kis_update_info.cpp +++ b/libs/ui/canvas/kis_update_info.cpp @@ -17,6 +17,9 @@ */ #include "kis_update_info.h" +KisPool KisUpdateInfo::s_pool(64); +KisPool KisOpenGLUpdateInfo::s_pool(64); + /** * The connection in KisCanvas2 uses queued signals * with an argument of KisNodeSP type, so we should