소스 검색

Fixing an issue where core thead sync would sometimes not finish on destroyed objects, leaking objects and memory

BearishSun 9 년 전
부모
커밋
712739f2c2

BIN
Data/Engine/GUISkin.asset


BIN
Data/Engine/ResourceManifest.asset


BIN
Data/Engine/Timestamp.asset


BIN
Data/Engine/arial.ttf.asset


+ 1 - 7
Source/BansheeCore/Include/BsCoreObjectManager.h

@@ -37,7 +37,7 @@ namespace BansheeEngine
 				:destinationObj(destObj), syncData(syncData), internalId(internalId)
 			{ }
 
-			std::weak_ptr<CoreObjectCore> destinationObj;
+			SPtr<CoreObjectCore> destinationObj;
 			CoreSyncData syncData;
 			UINT64 internalId;
 		};
@@ -91,12 +91,6 @@ namespace BansheeEngine
 		 */
 		void syncToCore(CoreObject* object, CoreAccessor& accessor);
 
-		/**
-		 * Clears any objects that are dirty and queued for sync on the core thread. Normally you only want to call this 
-		 * during shutdown when you no longer care about any of that data.
-		 */
-		void clearDirty();
-
 	private:
 		/**
 		 * Stores all syncable data from dirty core objects into memory allocated by the provided allocator. Additional 

+ 1 - 1
Source/BansheeCore/Source/BsCoreApplication.cpp

@@ -87,7 +87,7 @@ namespace BansheeEngine
 
 		// All CoreObject related modules should be shut down now. They have likely queued CoreObjects for destruction, so
 		// we need to wait for those objects to get destroyed before continuing.
-		CoreObjectManager::instance().clearDirty();
+		CoreObjectManager::instance().syncToCore(gCoreAccessor());
 		gCoreThread().update();
 		gCoreThread().submitAccessors(true);
 

+ 1 - 23
Source/BansheeCore/Source/BsCoreObjectManager.cpp

@@ -387,7 +387,7 @@ namespace BansheeEngine
 
 		for (auto& objSyncData : syncData.entries)
 		{
-			SPtr<CoreObjectCore> destinationObj = objSyncData.destinationObj.lock();
+			SPtr<CoreObjectCore> destinationObj = objSyncData.destinationObj;
 			if (destinationObj != nullptr)
 				destinationObj->syncToCore(objSyncData.syncData);
 
@@ -400,26 +400,4 @@ namespace BansheeEngine
 		syncData.entries.clear();
 		mCoreSyncData.pop_front();
 	}
-
-	void CoreObjectManager::clearDirty()
-	{
-		Lock lock(mObjectsMutex);
-
-		FrameAlloc* allocator = gCoreThread().getFrameAlloc();
-		for (auto& objectData : mDirtyObjects)
-		{
-			if (objectData.second.syncDataId != -1)
-			{
-				CoreStoredSyncObjData& objSyncData = mDestroyedSyncData[objectData.second.syncDataId];
-
-				UINT8* data = objSyncData.syncData.getBuffer();
-
-				if (data != nullptr)
-					allocator->dealloc(data);
-			}
-		}
-
-		mDirtyObjects.clear();
-		mDestroyedSyncData.clear();
-	}
 }

+ 1 - 1
Source/BansheeEngine/Source/BsApplication.cpp

@@ -32,7 +32,7 @@ namespace BansheeEngine
 	Application::~Application()
 	{
 		// Cleanup any new objects queued for destruction by unloaded scripts
-		CoreObjectManager::instance().clearDirty();
+		CoreObjectManager::instance().syncToCore(gCoreAccessor());
 		gCoreThread().update();
 		gCoreThread().submitAccessors(true);