[Bf-blender-cvs] [cbaa25e] master: Cycles: Fix two small memory leaks and deduplicate table freeing

Lukas Stockner noreply at git.blender.org
Sun May 8 17:45:16 CEST 2016


Commit: cbaa25eb88a25852791d4f8b18fb9e9137fea401
Author: Lukas Stockner
Date:   Sun May 8 01:44:01 2016 +0200
Branches: master
https://developer.blender.org/rBcbaa25eb88a25852791d4f8b18fb9e9137fea401

Cycles: Fix two small memory leaks and deduplicate table freeing

This commit makes remove_table skip the freeing if the offset is
already set to invalid - or, if it wasn't, set it to invalid after freeing.

That's what the current code was already doing in the Manager classes,
this change allows them to just call remove without the additional code.

Also, two potential memory leaks where new tables were always allocated
without freeing the old ones are fixed.

Reviewers: sergey, dingto, brecht

Differential Revision: https://developer.blender.org/D1974

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

M	intern/cycles/render/camera.cpp
M	intern/cycles/render/film.cpp
M	intern/cycles/render/shader.cpp
M	intern/cycles/render/tables.cpp
M	intern/cycles/render/tables.h

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

diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index 028916c..ad96473 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -323,6 +323,7 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
 #ifdef __CAMERA_MOTION__
 	kcam->shuttertime = (need_motion == Scene::MOTION_BLUR) ? shuttertime: -1.0f;
 
+	scene->lookup_tables->remove_table(&shutter_table_offset);
 	if(need_motion == Scene::MOTION_BLUR) {
 		vector<float> shutter_table;
 		util_cdf_inverted(SHUTTER_TABLE_SIZE,
@@ -335,10 +336,6 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
 		                                                       shutter_table);
 		kcam->shutter_table_offset = (int)shutter_table_offset;
 	}
-	else if(shutter_table_offset != TABLE_OFFSET_INVALID) {
-		scene->lookup_tables->remove_table(shutter_table_offset);
-		shutter_table_offset = TABLE_OFFSET_INVALID;
-	}
 #else
 	kcam->shuttertime = -1.0f;
 #endif
@@ -425,10 +422,7 @@ void Camera::device_free(Device * /*device*/,
                          DeviceScene * /*dscene*/,
                          Scene *scene)
 {
-	if(shutter_table_offset != TABLE_OFFSET_INVALID) {
-		scene->lookup_tables->remove_table(shutter_table_offset);
-		shutter_table_offset = TABLE_OFFSET_INVALID;
-	}
+	scene->lookup_tables->remove_table(&shutter_table_offset);
 }
 
 bool Camera::modified(const Camera& cam)
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index abdd1c2..95cb10a 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -428,6 +428,7 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
 
 	/* update filter table */
 	vector<float> table = filter_table(filter_type, filter_width);
+	scene->lookup_tables->remove_table(&filter_table_offset);
 	filter_table_offset = scene->lookup_tables->add_table(dscene, table);
 	kfilm->filter_table_offset = (int)filter_table_offset;
 
@@ -443,10 +444,7 @@ void Film::device_free(Device * /*device*/,
                        DeviceScene * /*dscene*/,
                        Scene *scene)
 {
-	if(filter_table_offset != TABLE_OFFSET_INVALID) {
-		scene->lookup_tables->remove_table(filter_table_offset);
-		filter_table_offset = TABLE_OFFSET_INVALID;
-	}
+	scene->lookup_tables->remove_table(&filter_table_offset);
 }
 
 bool Film::modified(const Film& film)
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index c07c6a0..82b6075 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -404,8 +404,8 @@ void ShaderManager::device_update_common(Device *device,
 			}
 		}
 		beckmann_table_offset = scene->lookup_tables->add_table(dscene, beckmann_table);
-		ktables->beckmann_offset = (int)beckmann_table_offset;
 	}
+	ktables->beckmann_offset = (int)beckmann_table_offset;
 
 	/* integrator */
 	KernelIntegrator *kintegrator = &dscene->data.integrator;
@@ -418,10 +418,7 @@ void ShaderManager::device_update_common(Device *device,
 
 void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scene *scene)
 {
-	if(beckmann_table_offset != TABLE_OFFSET_INVALID) {
-		scene->lookup_tables->remove_table(beckmann_table_offset);
-		beckmann_table_offset = TABLE_OFFSET_INVALID;
-	}
+	scene->lookup_tables->remove_table(&beckmann_table_offset);
 
 	device->tex_free(dscene->shader_flag);
 	dscene->shader_flag.clear();
diff --git a/intern/cycles/render/tables.cpp b/intern/cycles/render/tables.cpp
index cde024c..dfafd99 100644
--- a/intern/cycles/render/tables.cpp
+++ b/intern/cycles/render/tables.cpp
@@ -94,15 +94,21 @@ size_t LookupTables::add_table(DeviceScene *dscene, vector<float>& data)
 	return new_table.offset;
 }
 
-void LookupTables::remove_table(size_t offset)
+void LookupTables::remove_table(size_t *offset)
 {
+	if(*offset == TABLE_OFFSET_INVALID) {
+		/* The table isn't even allocated, so just return here. */
+		return;
+	}
+
 	need_update = true;
 
 	list<Table>::iterator table;
 
 	for(table = lookup_tables.begin(); table != lookup_tables.end(); table++) {
-		if(table->offset == offset) {
+		if(table->offset == *offset) {
 			lookup_tables.erase(table);
+			*offset = TABLE_OFFSET_INVALID;
 			return;
 		}
 	}
diff --git a/intern/cycles/render/tables.h b/intern/cycles/render/tables.h
index 4efa09f..1bb70b2 100644
--- a/intern/cycles/render/tables.h
+++ b/intern/cycles/render/tables.h
@@ -45,7 +45,7 @@ public:
 	void device_free(Device *device, DeviceScene *dscene);
 
 	size_t add_table(DeviceScene *dscene, vector<float>& data);
-	void remove_table(size_t offset);
+	void remove_table(size_t *offset);
 };
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list