[Bf-blender-cvs] [e2fa7f7] alembic_basic_io: Fix crash when exporting a hair system.

Kévin Dietrich noreply at git.blender.org
Thu May 26 17:29:55 CEST 2016


Commit: e2fa7f743b0f03fd06992b096c0912dc3ef9f612
Author: Kévin Dietrich
Date:   Thu May 26 16:04:27 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBe2fa7f743b0f03fd06992b096c0912dc3ef9f612

Fix crash when exporting a hair system.

Crash was due to accessing hair data from another thread (through the
export job).

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

M	source/blender/alembic/intern/alembic_capi.cc

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

diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 4d90fc0..748d733 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -41,6 +41,13 @@ extern "C" {
 #include "BKE_cdderivedmesh.h"
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
+#include "BKE_global.h"
+
+/* SpaceType struct has a member called 'new' which obviously conflicts with C++
+ * so temporarily redefining the new keyword to make it compile. */
+#define new extern_new
+#include "BKE_screen.h"
+#undef new
 
 #include "BLI_math.h"
 #include "BLI_string.h"
@@ -241,14 +248,20 @@ struct ExportJobData {
 	float *progress;
 };
 
-void export_startjob(void *cjv, short *stop, short *do_update, float *progress)
+static void export_startjob(void *customdata, short *stop, short *do_update, float *progress)
 {
-	ExportJobData *data = static_cast<ExportJobData *>(cjv);
+	ExportJobData *data = static_cast<ExportJobData *>(customdata);
 
 	data->stop = stop;
 	data->do_update = do_update;
 	data->progress = progress;
 
+	/* XXX annoying hack: needed to prevent data corruption when changing
+	 * scene frame in separate threads
+     */
+    G.is_rendering = true;
+    BKE_spacedata_draw_locks(true);
+
 	try {
 		AbcExporter exporter(data->scene, data->filename, data->settings);
 		exporter(*data->progress);
@@ -261,6 +274,12 @@ void export_startjob(void *cjv, short *stop, short *do_update, float *progress)
 	}
 }
 
+static void export_endjob(void */*customdata*/)
+{
+    G.is_rendering = false;
+    BKE_spacedata_draw_locks(false);
+}
+
 int ABC_export(Scene *scene, bContext *C, const char *filename,
                double start, double end,
                double xformstep, double geomstep,
@@ -318,7 +337,7 @@ int ABC_export(Scene *scene, bContext *C, const char *filename,
 	/* setup job */
 	WM_jobs_customdata_set(wm_job, job, MEM_freeN);
 	WM_jobs_timer(wm_job, 0.1, NC_SCENE | ND_COMPO_RESULT, NC_SCENE | ND_COMPO_RESULT);
-	WM_jobs_callbacks(wm_job, export_startjob, NULL, NULL, NULL);
+	WM_jobs_callbacks(wm_job, export_startjob, NULL, NULL, export_endjob);
 
 	WM_jobs_start(CTX_wm_manager(C), wm_job);




More information about the Bf-blender-cvs mailing list