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