This fixes data race warnings by ThreadSanitizer. ff_thread_report_progress and ff_thread_await_progress should read progress[field] only when holding progress_mutex because progress_mutex guards frame progress values. --- libavcodec/pthread_frame.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index b77dd1e..b7f603d 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -474,7 +474,7 @@ void ff_thread_report_progress(ThreadFrame *f, int n, int field) PerThreadContext *p; volatile int *progress = f->progress ? (int*)f->progress->data : NULL; - if (!progress || progress[field] >= n) return; + if (!progress) return; p = f->owner->internal->thread_ctx; @@ -482,8 +482,10 @@ void ff_thread_report_progress(ThreadFrame *f, int n, int field) av_log(f->owner, AV_LOG_DEBUG, "%p finished %d field %d\n", progress, n, field); pthread_mutex_lock(&p->progress_mutex); - progress[field] = n; - pthread_cond_broadcast(&p->progress_cond); + if (progress[field] < n) { + progress[field] = n; + pthread_cond_broadcast(&p->progress_cond); + } pthread_mutex_unlock(&p->progress_mutex); } @@ -492,7 +494,7 @@ void ff_thread_await_progress(ThreadFrame *f, int n, int field) PerThreadContext *p; volatile int *progress = f->progress ? (int*)f->progress->data : NULL; - if (!progress || progress[field] >= n) return; + if (!progress) return; p = f->owner->internal->thread_ctx; -- 2.7.0.rc3.207.g0ac5344 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel