Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-02-13 16:31:02 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-02-13 16:31:02 +0400
commit910f4df45d5096c3ce326860b4d919a1964468ac (patch)
treeabc5cfacf8116eaa3fd6b476d86a79ed2186daf7
parent83617d24d536ec234bbe53b8b0fbcb76e7b5b3ee (diff)
Fix race condition between tracking thread and tracks map sync
This might have been a reason of bug T38281.
-rw-r--r--source/blender/blenkernel/intern/tracking_region_tracker.c9
-rw-r--r--source/blender/blenkernel/intern/tracking_util.c9
-rw-r--r--source/blender/blenkernel/tracking_private.h5
-rw-r--r--source/blender/editors/space_clip/clip_dopesheet_draw.c3
4 files changed, 20 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/tracking_region_tracker.c b/source/blender/blenkernel/intern/tracking_region_tracker.c
index 6a274921d44..7bada00655b 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 203208cd462..4b3c354dd12 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 3245fe5fbd5..981b7951097 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 d15a61d6430..3ada57a4e30 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);