[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56306] trunk/blender/source/blender/ blenkernel/intern/smoke.c: Fix #35082: Blender Freeze when change smoke domain setting

Sergey Sharybin sergey.vfx at gmail.com
Fri Apr 26 10:30:56 CEST 2013


Revision: 56306
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56306
Author:   nazgul
Date:     2013-04-26 08:30:55 +0000 (Fri, 26 Apr 2013)
Log Message:
-----------
Fix #35082: Blender Freeze when change smoke domain setting

Issue was introduced by svn rev56273 and was caused by
both smokeModifier_do and smokeModifier_reset (which is
called from smokeModifier_do) do mutex lock/unlock.
This lead to quite undefined behavior caused by the same
thread released mutex twice.

Solved by not locking mutex from inside routines calling
from smokeModifier_process -- mutex is locked in parent
function anyway.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56273

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/smoke.c

Modified: trunk/blender/source/blender/blenkernel/intern/smoke.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/smoke.c	2013-04-26 02:44:21 UTC (rev 56305)
+++ trunk/blender/source/blender/blenkernel/intern/smoke.c	2013-04-26 08:30:55 UTC (rev 56306)
@@ -428,7 +428,7 @@
 	}
 }
 
-void smokeModifier_reset(struct SmokeModifierData *smd)
+static void smokeModifier_reset_ex(struct SmokeModifierData *smd, bool need_lock)
 {
 	if (smd)
 	{
@@ -440,12 +440,14 @@
 
 			if (smd->domain->fluid)
 			{
-				BLI_rw_mutex_lock(smd->domain->fluid_mutex, THREAD_LOCK_WRITE);
+				if (need_lock)
+					BLI_rw_mutex_lock(smd->domain->fluid_mutex, THREAD_LOCK_WRITE);
 
 				smoke_free(smd->domain->fluid);
 				smd->domain->fluid = NULL;
 
-				BLI_rw_mutex_unlock(smd->domain->fluid_mutex);
+				if (need_lock)
+					BLI_rw_mutex_unlock(smd->domain->fluid_mutex);
 			}
 
 			smokeModifier_reset_turbulence(smd);
@@ -473,6 +475,11 @@
 	}
 }
 
+void smokeModifier_reset(struct SmokeModifierData *smd)
+{
+	smokeModifier_reset_ex(smd, true);
+}
+
 void smokeModifier_free(SmokeModifierData *smd)
 {
 	if (smd)
@@ -2194,7 +2201,7 @@
 		else if (scene->r.cfra < smd->time)
 		{
 			smd->time = scene->r.cfra;
-			smokeModifier_reset(smd);
+			smokeModifier_reset_ex(smd, false);
 		}
 	}
 	else if (smd->type & MOD_SMOKE_TYPE_COLL)
@@ -2214,7 +2221,7 @@
 		smd->time = scene->r.cfra;
 		if (scene->r.cfra < smd->time)
 		{
-			smokeModifier_reset(smd);
+			smokeModifier_reset_ex(smd, false);
 		}
 	}
 	else if (smd->type & MOD_SMOKE_TYPE_DOMAIN)
@@ -2236,7 +2243,7 @@
 		if (!smd->domain->fluid || framenr == startframe)
 		{
 			BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
-			smokeModifier_reset(smd);
+			smokeModifier_reset_ex(smd, false);
 			BKE_ptcache_validate(cache, framenr);
 			cache->flag &= ~PTCACHE_REDO_NEEDED;
 		}




More information about the Bf-blender-cvs mailing list