[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53976] trunk/blender/source/blender: fix [#33836] issuing bpy.ops.render.render() in console crashes the program

Campbell Barton ideasman42 at gmail.com
Tue Jan 22 03:21:25 CET 2013


Revision: 53976
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53976
Author:   campbellbarton
Date:     2013-01-22 02:21:21 +0000 (Tue, 22 Jan 2013)
Log Message:
-----------
fix [#33836] issuing bpy.ops.render.render() in console crashes the program

don't check the event queue from threads, assert if this happens in future.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/windowmanager/intern/wm_window.c

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2013-01-22 01:52:16 UTC (rev 53975)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2013-01-22 02:21:21 UTC (rev 53976)
@@ -73,6 +73,7 @@
 #include "render_intern.h"
 
 /* Render Callbacks */
+static int render_break(void *rjv);
 
 /* called inside thread! */
 void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volatile rcti *renrect)
@@ -210,7 +211,7 @@
 	lay = (v3d) ? v3d->lay : scene->lay;
 
 	G.is_break = FALSE;
-	RE_test_break_cb(re, NULL, (int (*)(void *))blender_test_break);
+	RE_test_break_cb(re, NULL, render_break);
 
 	ima = BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result");
 	BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
@@ -443,6 +444,15 @@
 	return 0;
 }
 
+/* for exec() when there is no render job
+ * note: this wont check for the escape key being pressed, but doing so isnt threadsafe */
+static int render_break(void *UNUSED(rjv))
+{
+	if (G.is_break)
+		return 1;
+	return 0;
+}
+
 /* runs in thread, no cursor setting here works. careful with notifiers too (malloc conflicts) */
 /* maybe need a way to get job send notifer? */
 static void render_drawlock(void *UNUSED(rjv), int lock)

Modified: trunk/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_window.c	2013-01-22 01:52:16 UTC (rev 53975)
+++ trunk/blender/source/blender/windowmanager/intern/wm_window.c	2013-01-22 02:21:21 UTC (rev 53976)
@@ -75,6 +75,11 @@
 
 #include "UI_interface.h"
 
+/* for assert */
+#ifndef NDEBUG
+#  include "BLI_threads.h"
+#endif
+
 /* the global to talk to ghost */
 static GHOST_SystemHandle g_system = NULL;
 
@@ -1036,8 +1041,12 @@
 
 void wm_window_process_events(const bContext *C) 
 {
-	int hasevent = GHOST_ProcessEvents(g_system, 0); /* 0 is no wait */
-	
+	int hasevent;
+
+	BLI_assert(BLI_thread_is_main());
+
+	hasevent = GHOST_ProcessEvents(g_system, 0); /* 0 is no wait */
+
 	if (hasevent)
 		GHOST_DispatchEvents(g_system);
 	
@@ -1059,7 +1068,9 @@
 {
 	static double ltime = 0;
 	double curtime = PIL_check_seconds_timer();
-	
+
+	BLI_assert(BLI_thread_is_main());
+
 	/* only check for breaks every 50 milliseconds
 	 * if we get called more often.
 	 */




More information about the Bf-blender-cvs mailing list