[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60343] trunk/blender/source/blender: Fix #36800: closing render window during render crashes, the operator would be

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Sep 23 21:35:21 CEST 2013


Revision: 60343
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60343
Author:   blendix
Date:     2013-09-23 19:35:21 +0000 (Mon, 23 Sep 2013)
Log Message:
-----------
Fix #36800: closing render window during render crashes, the operator would be
cancelled before the job, causing invalid access to op->reports in the job thread.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_jobs.c

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2013-09-23 19:33:51 UTC (rev 60342)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2013-09-23 19:35:21 UTC (rev 60343)
@@ -564,6 +564,17 @@
 	return OPERATOR_PASS_THROUGH;
 }
 
+static int screen_render_cancel(bContext *C, wmOperator *op)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
+	Scene *scene = (Scene *) op->customdata;
+
+	/* kill on cancel, because job is using op->reports */
+	WM_jobs_kill_type(wm, scene, WM_JOB_TYPE_RENDER);
+
+	return OPERATOR_CANCELLED;
+}
+
 /* using context, starts job */
 static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
@@ -732,6 +743,7 @@
 	/* api callbacks */
 	ot->invoke = screen_render_invoke;
 	ot->modal = screen_render_modal;
+	ot->cancel = screen_render_cancel;
 	ot->exec = screen_render_exec;
 
 	/*ot->poll = ED_operator_screenactive;*/ /* this isn't needed, causes failer in background mode */

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2013-09-23 19:33:51 UTC (rev 60342)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2013-09-23 19:35:21 UTC (rev 60343)
@@ -926,13 +926,13 @@
 		/* stop all running jobs, except screen one. currently previews frustrate Render
 		 * needed to make so sequencer's rendering doesn't conflict with compositor
 		 */
-		WM_jobs_kill_type(CTX_wm_manager(C), WM_JOB_TYPE_COMPOSITE);
+		WM_jobs_kill_type(CTX_wm_manager(C), NULL, WM_JOB_TYPE_COMPOSITE);
 
 		if ((scene->r.seq_flag & R_SEQ_GL_PREV) == 0) {
 			/* in case of final rendering used for preview, kill all previews,
 			 * otherwise threading conflict will happen in rendering module
 			 */
-			WM_jobs_kill_type(CTX_wm_manager(C), WM_JOB_TYPE_RENDER_PREVIEW);
+			WM_jobs_kill_type(CTX_wm_manager(C), NULL, WM_JOB_TYPE_RENDER_PREVIEW);
 		}
 	}
 

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2013-09-23 19:33:51 UTC (rev 60342)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2013-09-23 19:35:21 UTC (rev 60343)
@@ -393,7 +393,7 @@
 void		WM_jobs_kill(struct wmWindowManager *wm, void *owner, void (*)(void *, short int *, short int *, float *));
 void		WM_jobs_kill_all(struct wmWindowManager *wm);
 void		WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner);
-void		WM_jobs_kill_type(struct wmWindowManager *wm, int job_type);
+void		WM_jobs_kill_type(struct wmWindowManager *wm, void *owner, int job_type);
 
 int			WM_jobs_has_running(struct wmWindowManager *wm);
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2013-09-23 19:33:51 UTC (rev 60342)
+++ trunk/blender/source/blender/windowmanager/intern/wm_jobs.c	2013-09-23 19:35:21 UTC (rev 60343)
@@ -474,15 +474,16 @@
 }
 
 
-void WM_jobs_kill_type(struct wmWindowManager *wm, int job_type)
+void WM_jobs_kill_type(struct wmWindowManager *wm, void *owner, int job_type)
 {
 	wmJob *wm_job, *next_job;
 	
 	for (wm_job = wm->jobs.first; wm_job; wm_job = next_job) {
 		next_job = wm_job->next;
 
-		if (wm_job->job_type == job_type)
-			wm_jobs_kill_job(wm, wm_job);
+		if (!owner || wm_job->owner == owner)
+			if (wm_job->job_type == job_type)
+				wm_jobs_kill_job(wm, wm_job);
 	}
 }
 




More information about the Bf-blender-cvs mailing list