[Bf-blender-cvs] [910f4df] master: Fix race condition between tracking thread and tracks map sync

Sergey Sharybin noreply at git.blender.org
Thu Feb 13 13:34:49 CET 2014


Commit: 910f4df45d5096c3ce326860b4d919a1964468ac
Author: Sergey Sharybin
Date:   Thu Feb 13 18:31:02 2014 +0600
https://developer.blender.org/rB910f4df45d5096c3ce326860b4d919a1964468ac

Fix race condition between tracking thread and tracks map sync

This might have been a reason of bug T38281.

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

M	source/blender/blenkernel/intern/tracking_region_tracker.c
M	source/blender/blenkernel/intern/tracking_util.c
M	source/blender/blenkernel/tracking_private.h
M	source/blender/editors/space_clip/clip_dopesheet_draw.c

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

diff --git a/source/blender/blenkernel/intern/tracking_region_tracker.c b/source/blender/blenkernel/intern/tracking_region_tracker.c
index 6a27492..7bada00 100644
--- a/source/blender/blenkernel/intern/tracking_region_tracker.c
+++ b/source/blender/blenkernel/intern/tracking_region_tracker.c
@@ -669,11 +669,10 @@ bool BKE_tracking_context_step(MovieTrackingContext *context)
 				                                    dst_pixel_x, dst_pixel_y);
 			}
 
-#pragma omp critical
-			{
-				tracking_insert_new_marker(context, track, marker, curfra, tracked,
-				                           frame_width, frame_height, dst_pixel_x, dst_pixel_y);
-			}
+			BLI_spin_lock(&context->tracks_map->spin_lock);
+			tracking_insert_new_marker(context, track, marker, curfra, tracked,
+			                           frame_width, frame_height, dst_pixel_x, dst_pixel_y);
+			BLI_spin_unlock(&context->tracks_map->spin_lock);
 
 			ok = true;
 		}
diff --git a/source/blender/blenkernel/intern/tracking_util.c b/source/blender/blenkernel/intern/tracking_util.c
index 203208c..4b3c354 100644
--- a/source/blender/blenkernel/intern/tracking_util.c
+++ b/source/blender/blenkernel/intern/tracking_util.c
@@ -70,6 +70,8 @@ TracksMap *tracks_map_new(const char *object_name, bool is_camera, int num_track
 
 	map->hash = BLI_ghash_ptr_new("TracksMap hash");
 
+	BLI_spin_init(&map->spin_lock);
+
 	return map;
 }
 
@@ -139,6 +141,8 @@ void tracks_map_merge(TracksMap *map, MovieTracking *tracking)
 			if (BLI_findindex(old_tracks, old_track) != -1) {
 				BLI_remlink(old_tracks, old_track);
 
+				BLI_spin_lock(&map->spin_lock);
+
 				/* Copy flags like selection back to the track map. */
 				track->flag = old_track->flag;
 				track->pat_flag = old_track->pat_flag;
@@ -149,6 +153,8 @@ void tracks_map_merge(TracksMap *map, MovieTracking *tracking)
 				*old_track = *track;
 				old_track->markers = MEM_dupallocN(old_track->markers);
 
+				BLI_spin_unlock(&map->spin_lock);
+
 				BLI_addtail(&tracks, old_track);
 
 				mapped_to_old = true;
@@ -210,6 +216,9 @@ void tracks_map_free(TracksMap *map, void (*customdata_free)(void *customdata))
 		MEM_freeN(map->customdata);
 
 	MEM_freeN(map->tracks);
+
+	BLI_spin_end(&map->spin_lock);
+
 	MEM_freeN(map);
 }
 
diff --git a/source/blender/blenkernel/tracking_private.h b/source/blender/blenkernel/tracking_private.h
index 3245fe5..981b795 100644
--- a/source/blender/blenkernel/tracking_private.h
+++ b/source/blender/blenkernel/tracking_private.h
@@ -35,6 +35,8 @@
 #ifndef __TRACKING_PRIVATE_H__
 #define __TRACKING_PRIVATE_H__
 
+#include "BLI_threads.h"
+
 struct GHash;
 struct MovieTracking;
 struct MovieTrackingMarker;
@@ -54,6 +56,9 @@ typedef struct TracksMap {
 	struct GHash *hash;
 
 	int ptr;
+
+	/* Spin lock is used to sync context during tracking. */
+	SpinLock spin_lock;
 } TracksMap;
 
 struct TracksMap *tracks_map_new(const char *object_name, bool is_camera, int num_tracks, int customdata_size);
diff --git a/source/blender/editors/space_clip/clip_dopesheet_draw.c b/source/blender/editors/space_clip/clip_dopesheet_draw.c
index d15a61d..3ada57a 100644
--- a/source/blender/editors/space_clip/clip_dopesheet_draw.c
+++ b/source/blender/editors/space_clip/clip_dopesheet_draw.c
@@ -160,8 +160,9 @@ static void clip_draw_dopesheet_background(ARegion *ar, MovieClip *clip)
 			int start_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, coverage_segment->start_frame);
 			int end_frame = BKE_movieclip_remap_clip_to_scene_frame(clip, coverage_segment->end_frame);
 
-			if (coverage_segment->coverage == TRACKING_COVERAGE_BAD)
+			if (coverage_segment->coverage == TRACKING_COVERAGE_BAD) {
 				glColor4f(1.0f, 0.0f, 0.0f, 0.07f);
+			}
 			else
 				glColor4f(1.0f, 1.0f, 0.0f, 0.07f);




More information about the Bf-blender-cvs mailing list