Commit 4845f072 authored by Wan-Teh Chang's avatar Wan-Teh Chang Committed by Ronald S. Bultje

Move the |die| member of FrameThreadContext to PerThreadContext.

This fixes a data race warning by ThreadSanitizer.
FrameThreadContext.die is read by all the worker threads but is not
protected by any mutex. Move it to PerThreadContext so that each worker
thread reads its own copy of |die|, which can then be protected with
PerThreadContext.mutex.
Signed-off-by: 's avatarWan-Teh Chang <wtc@google.com>
Signed-off-by: 's avatarRonald S. Bultje <rsbultje@gmail.com>
parent f1148390
...@@ -93,6 +93,8 @@ typedef struct PerThreadContext { ...@@ -93,6 +93,8 @@ typedef struct PerThreadContext {
const enum AVPixelFormat *available_formats; ///< Format array for get_format() const enum AVPixelFormat *available_formats; ///< Format array for get_format()
enum AVPixelFormat result_format; ///< get_format() result enum AVPixelFormat result_format; ///< get_format() result
int die; ///< Set when the thread should exit.
} PerThreadContext; } PerThreadContext;
/** /**
...@@ -111,8 +113,6 @@ typedef struct FrameThreadContext { ...@@ -111,8 +113,6 @@ typedef struct FrameThreadContext {
* Set for the first N packets, where N is the number of threads. * Set for the first N packets, where N is the number of threads.
* While it is set, ff_thread_en/decode_frame won't return any results. * While it is set, ff_thread_en/decode_frame won't return any results.
*/ */
int die; ///< Set when threads should exit.
} FrameThreadContext; } FrameThreadContext;
#define THREAD_SAFE_CALLBACKS(avctx) \ #define THREAD_SAFE_CALLBACKS(avctx) \
...@@ -134,10 +134,10 @@ static attribute_align_arg void *frame_worker_thread(void *arg) ...@@ -134,10 +134,10 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
pthread_mutex_lock(&p->mutex); pthread_mutex_lock(&p->mutex);
while (1) { while (1) {
while (p->state == STATE_INPUT_READY && !fctx->die) while (p->state == STATE_INPUT_READY && !p->die)
pthread_cond_wait(&p->input_cond, &p->mutex); pthread_cond_wait(&p->input_cond, &p->mutex);
if (fctx->die) break; if (p->die) break;
if (!codec->update_thread_context && THREAD_SAFE_CALLBACKS(avctx)) if (!codec->update_thread_context && THREAD_SAFE_CALLBACKS(avctx))
ff_thread_finish_setup(avctx); ff_thread_finish_setup(avctx);
...@@ -553,12 +553,11 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count) ...@@ -553,12 +553,11 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
fctx->threads->avctx->internal->is_copy = 1; fctx->threads->avctx->internal->is_copy = 1;
} }
fctx->die = 1;
for (i = 0; i < thread_count; i++) { for (i = 0; i < thread_count; i++) {
PerThreadContext *p = &fctx->threads[i]; PerThreadContext *p = &fctx->threads[i];
pthread_mutex_lock(&p->mutex); pthread_mutex_lock(&p->mutex);
p->die = 1;
pthread_cond_signal(&p->input_cond); pthread_cond_signal(&p->input_cond);
pthread_mutex_unlock(&p->mutex); pthread_mutex_unlock(&p->mutex);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment