From 1a9b8a9a823d6ac23d7de95fd2ad81591eb29b3b Mon Sep 17 00:00:00 2001 From: D-AIRY <admin@ds-servers.com> Date: Tue, 31 Mar 2020 21:07:39 +0300 Subject: [PATCH] Threadsafe refcounting --- source/SkyXEngine.h | 2 +- source/anim/DynamicModelProvider.cpp | 2 +- source/gdefines.h | 18 ++++++++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/source/SkyXEngine.h b/source/SkyXEngine.h index e02265d45..dd76195a8 100644 --- a/source/SkyXEngine.h +++ b/source/SkyXEngine.h @@ -292,7 +292,7 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот #ifndef __SKYXENGINE_H #define __SKYXENGINE_H -#define SKYXENGINE_VERSION "X.7.1" +#define SKYXENGINE_VERSION "X.8.0-dev" #define SKYXENGINE_VERSION4EDITORS "SkyXEngine version " ## SKYXENGINE_VERSION diff --git a/source/anim/DynamicModelProvider.cpp b/source/anim/DynamicModelProvider.cpp index ae0e4fb1d..7e85e0776 100644 --- a/source/anim/DynamicModelProvider.cpp +++ b/source/anim/DynamicModelProvider.cpp @@ -351,7 +351,7 @@ void CDynamicModelProvider::computeVisibility(const IFrustum *pFrustum, CRendera { pVisibility->setItemCountDynamic(m_apModels.size()); pVisibility->resetItemTransparentDynamic(); -#if 0 +#if 1 CVisUpdate cycle(pFrustum, pVisibility, pReference, m_apModels); ID id = m_pCore->getAsyncTaskRunner()->forLoop(0, m_apModels.size(), &cycle, 500); m_pCore->getAsyncTaskRunner()->waitForLoop(id); diff --git a/source/gdefines.h b/source/gdefines.h index 833029213..136993cfd 100644 --- a/source/gdefines.h +++ b/source/gdefines.h @@ -159,8 +159,12 @@ struct IBaseObject class IXUnknown { protected: + IXUnknown() + { + m_uRefCount.store(1); + } virtual ~IXUnknown() = default; - UINT m_uRefCount = 1; + std::atomic_uint m_uRefCount; public: void XMETHODCALLTYPE AddRef() { @@ -168,8 +172,7 @@ public: } virtual void XMETHODCALLTYPE Release() { - --m_uRefCount; - if(!m_uRefCount) + if(!--m_uRefCount) { delete this; } @@ -186,7 +189,11 @@ template <class T> class IXUnknownImplementation: public T { private: - UINT m_uRefCount = 1; + IXUnknownImplementation() + { + m_uRefCount.store(1); + } + std::atomic_uint m_uRefCount; public: void XMETHODCALLTYPE AddRef() override { @@ -194,8 +201,7 @@ public: } virtual void XMETHODCALLTYPE Release() override { - --m_uRefCount; - if(!m_uRefCount) + if(!--m_uRefCount) { delete this; } -- GitLab