[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52019] trunk/blender/intern/cycles: Fix #33125: cycles OSL crash with multiple render sessions running at the same time.

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Nov 9 04:10:23 CET 2012


Revision: 52019
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52019
Author:   blendix
Date:     2012-11-09 03:10:22 +0000 (Fri, 09 Nov 2012)
Log Message:
-----------
Fix #33125: cycles OSL crash with multiple render sessions running at the same time.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/osl/osl_globals.h
    trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
    trunk/blender/intern/cycles/render/osl.cpp
    trunk/blender/intern/cycles/render/osl.h

Modified: trunk/blender/intern/cycles/kernel/osl/osl_globals.h
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_globals.h	2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/kernel/osl/osl_globals.h	2012-11-09 03:10:22 UTC (rev 52019)
@@ -68,6 +68,11 @@
 	};
 
 	static tls_ptr(ThreadData, thread_data);
+	static thread_mutex thread_data_mutex;
+	static volatile int thread_data_users;
+
+	void thread_data_init();
+	void thread_data_free();
 };
 
 CCL_NAMESPACE_END

Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp	2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp	2012-11-09 03:10:22 UTC (rev 52019)
@@ -32,9 +32,32 @@
 CCL_NAMESPACE_BEGIN
 
 tls_ptr(OSLGlobals::ThreadData, OSLGlobals::thread_data);
+volatile int OSLGlobals::thread_data_users = 0;
+thread_mutex OSLGlobals::thread_data_mutex;
 
 /* Threads */
 
+void OSLGlobals::thread_data_init()
+{
+	thread_scoped_lock thread_data_lock(thread_data_mutex);
+
+	if(thread_data_users == 0)
+		tls_create(OSLGlobals::ThreadData, thread_data);
+
+	thread_data_users++;
+}
+
+void OSLGlobals::thread_data_free()
+{
+	/* thread local storage delete */
+	thread_scoped_lock thread_data_lock(thread_data_mutex);
+
+	thread_data_users--;
+
+	if(thread_data_users == 0)
+		tls_delete(OSLGlobals::ThreadData, thread_data);
+}
+
 void OSLShader::thread_init(KernelGlobals *kg)
 {
 	OSL::ShadingSystem *ss = kg->osl.ss;

Modified: trunk/blender/intern/cycles/render/osl.cpp
===================================================================
--- trunk/blender/intern/cycles/render/osl.cpp	2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/render/osl.cpp	2012-11-09 03:10:22 UTC (rev 52019)
@@ -45,6 +45,8 @@
 
 OSLShaderManager::OSLShaderManager()
 {
+	thread_data_initialized = false;
+
 	services = new OSLRenderServices();
 
 	shading_system_init();
@@ -91,8 +93,6 @@
 	og->background_state = og->surface_state[background_id & SHADER_MASK];
 	og->use = true;
 
-	tls_create(OSLGlobals::ThreadData, og->thread_data);
-
 	foreach(Shader *shader, scene->shaders)
 		shader->need_update = false;
 
@@ -102,6 +102,11 @@
 	scene->image_manager->set_osl_texture_system((void*)ts);
 
 	device_update_common(device, dscene, scene, progress);
+
+	if(!thread_data_initialized) {
+		og->thread_data_init();
+		thread_data_initialized = true;
+	}
 }
 
 void OSLShaderManager::device_free(Device *device, DeviceScene *dscene)
@@ -114,12 +119,15 @@
 	og->use = false;
 	og->ss = NULL;
 
-	tls_delete(OSLGlobals::ThreadData, og->thread_data);
-
 	og->surface_state.clear();
 	og->volume_state.clear();
 	og->displacement_state.clear();
 	og->background_state.reset();
+
+	if(thread_data_initialized) {
+		og->thread_data_free();
+		thread_data_initialized = false;
+	}
 }
 
 void OSLShaderManager::texture_system_init()

Modified: trunk/blender/intern/cycles/render/osl.h
===================================================================
--- trunk/blender/intern/cycles/render/osl.h	2012-11-09 03:10:15 UTC (rev 52018)
+++ trunk/blender/intern/cycles/render/osl.h	2012-11-09 03:10:22 UTC (rev 52019)
@@ -73,6 +73,8 @@
 	OSLRenderServices *services;
 	OSL::ErrorHandler errhandler;
 	set<string> loaded_shaders;
+
+	bool thread_data_initialized;
 };
 
 #endif




More information about the Bf-blender-cvs mailing list