[Bf-blender-cvs] [ef090e1] alembic_basic_io: Cleanup, try to address alembicManager memory leak.

Kévin Dietrich noreply at git.blender.org
Tue Mar 29 06:30:07 CEST 2016


Commit: ef090e1ead39c75eb0ab8ee866ac65acaa6ca994
Author: Kévin Dietrich
Date:   Tue Mar 29 06:28:54 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBef090e1ead39c75eb0ab8ee866ac65acaa6ca994

Cleanup, try to address alembicManager memory leak.

===================================================================

M	source/blender/alembic/intern/alembic_capi.cc

===================================================================

diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index e34d3ea..45c6e34 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -156,9 +156,16 @@ struct alembicManager {
 		object_map.clear();
 		xform_map.clear();
 
-		std::tr1::unordered_map<std::string, IArchive*>::iterator it = archives.begin();
+		std::tr1::unordered_map<std::string, IArchive *>::iterator it = archives.begin();
+
 		for (; it != archives.end(); ++it) {
-			delete it->second;
+			/* XXX */
+			try {
+				delete it->second;
+			}
+			catch (const Alembic::Util::Exception &e) {
+				std::cerr << e.what() << '\n';
+			}
 		}
 
 		BLI_mutex_unlock(mutex);
@@ -169,51 +176,54 @@ struct alembicManager {
 	IArchive *getArchive(const std::string &filename)
 	{
 		std::tr1::unordered_map<std::string, IArchive*>::iterator it = archives.find(filename);
-		std::tr1::unordered_map< IArchive*, std::tr1::unordered_map<std::string, IObject> >::iterator it_ob;
-		std::tr1::unordered_map< IArchive*, std::tr1::unordered_map<std::string, IXformSchema> >::iterator it_xf;
 
-		if (it == archives.end()) {
-			if ((int)archives.size() > max_alembic_files) {
-				it = archives.begin();
+		if (it != archives.end()) {
+			return it->second;
+		}
 
-				it_ob = object_map.find(it->second);
-				it_xf = xform_map.find(it->second);;
+		if ((int)archives.size() > max_alembic_files) {
+			std::tr1::unordered_map<IArchive *, std::tr1::unordered_map<std::string, IObject> >::iterator it_ob;
+			std::tr1::unordered_map<IArchive *, std::tr1::unordered_map<std::string, IXformSchema> >::iterator it_xf;
 
-				if (it_ob != object_map.end())
-					object_map.erase(it_ob);
+			it = archives.begin();
 
-				if (it_xf != xform_map.end())
-					xform_map.erase(it_xf);
+			it_ob = object_map.find(it->second);
+			it_xf = xform_map.find(it->second);;
 
-				delete it->second;
-				archives.erase(it);
+			if (it_ob != object_map.end()) {
+				object_map.erase(it_ob);
 			}
 
-			IArchive *archive;
+			if (it_xf != xform_map.end()) {
+				xform_map.erase(it_xf);
+			}
 
+			delete it->second;
+			archives.erase(it);
+		}
+
+		IArchive *archive;
+
+		try {
+			archive = new IArchive(Alembic::AbcCoreHDF5::ReadArchive(),
+			                       filename.c_str(), ErrorHandler::kThrowPolicy,
+			                       cache_ptr);
+		}
+		catch (const Exception &e) {
 			try {
-				archive = new IArchive (Alembic::AbcCoreHDF5::ReadArchive(),
-				                        filename.c_str(), ErrorHandler::kThrowPolicy ,
-				                        cache_ptr);
+				archive = new IArchive(Alembic::AbcCoreOgawa::ReadArchive(),
+				                       filename.c_str(), ErrorHandler::kThrowPolicy,
+				                       cache_ptr);
 			}
-			catch (Exception &e) {
-				try {
-					archive = new IArchive (Alembic::AbcCoreOgawa::ReadArchive(),
-					                        filename.c_str(), ErrorHandler::kThrowPolicy ,
-					                        cache_ptr);
-				}
-				catch (Exception &e) {
-					std::cerr << e.what() << std::endl;
-					return NULL;
-				}
+			catch (const Exception &e) {
+				std::cerr << e.what() << std::endl;
+				return NULL;
 			}
-
-			archives[filename] = archive;
-			return archive;
 		}
-		return it->second;
 
-		return NULL;
+		archives[filename] = archive;
+
+		return archive;
 	}
 
 	void visitObjects(IObject iObj, IObject &ret, std::string path, bool &found)
@@ -336,7 +346,8 @@ struct alembicManager {
 };
 
 /* TODO */
-static alembicManager *abc_manager = new alembicManager();
+static alembicManager __abc_manager;
+static alembicManager *abc_manager = &__abc_manager;// new alembicManager();
 
 static Material *findMaterial(const char *name)
 {




More information about the Bf-blender-cvs mailing list