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

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2017-09-11 16:58:47 +0300
committerRonald S. Bultje <rsbultje@gmail.com>2017-09-12 15:21:10 +0300
commit183216b21870f21c86c904a7530d53682d7db46d (patch)
treed8e6de0c676031fcd8a56aabe93e66b0018d04ac /libavcodec/frame_thread_encoder.c
parent549ef6ef9a8168281640b9cd0240abe071cbbda3 (diff)
frame_thread_encoder: make 'exit' member atomic.
Should fix the following tsan warning: WARNING: ThreadSanitizer: data race (pid=19806) Read of size 4 at 0x7b84000012f0 by thread T9: #0 worker src/libavcodec/frame_thread_encoder.c:66 (ffmpeg+0x0000007f349e) [..] Previous write of size 4 at 0x7b84000012f0 by main thread (mutexes: write M1395): #0 ff_frame_thread_encoder_free src/libavcodec/frame_thread_encoder.c:239 (ffmpeg+0x0000007f379e) [..]
Diffstat (limited to 'libavcodec/frame_thread_encoder.c')
-rw-r--r--libavcodec/frame_thread_encoder.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c
index 33928fe5f0..35a37c4372 100644
--- a/libavcodec/frame_thread_encoder.c
+++ b/libavcodec/frame_thread_encoder.c
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <stdatomic.h>
+
#include "frame_thread_encoder.h"
#include "libavutil/fifo.h"
@@ -55,7 +57,7 @@ typedef struct{
unsigned finished_task_index;
pthread_t worker[MAX_THREADS];
- int exit;
+ atomic_int exit;
} ThreadContext;
static void * attribute_align_arg worker(void *v){
@@ -63,7 +65,7 @@ static void * attribute_align_arg worker(void *v){
ThreadContext *c = avctx->internal->frame_thread_encoder;
AVPacket *pkt = NULL;
- while(!c->exit){
+ while (!atomic_load(&c->exit)) {
int got_packet, ret;
AVFrame *frame;
Task task;
@@ -73,8 +75,8 @@ static void * attribute_align_arg worker(void *v){
av_init_packet(pkt);
pthread_mutex_lock(&c->task_fifo_mutex);
- while (av_fifo_size(c->task_fifo) <= 0 || c->exit) {
- if(c->exit){
+ while (av_fifo_size(c->task_fifo) <= 0 || atomic_load(&c->exit)) {
+ if (atomic_load(&c->exit)) {
pthread_mutex_unlock(&c->task_fifo_mutex);
goto end;
}
@@ -187,6 +189,7 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){
pthread_mutex_init(&c->buffer_mutex, NULL);
pthread_cond_init(&c->task_fifo_cond, NULL);
pthread_cond_init(&c->finished_task_cond, NULL);
+ atomic_init(&c->exit, 0);
for(i=0; i<avctx->thread_count ; i++){
AVDictionary *tmp = NULL;
@@ -236,7 +239,7 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){
ThreadContext *c= avctx->internal->frame_thread_encoder;
pthread_mutex_lock(&c->task_fifo_mutex);
- c->exit = 1;
+ atomic_store(&c->exit, 1);
pthread_cond_broadcast(&c->task_fifo_cond);
pthread_mutex_unlock(&c->task_fifo_mutex);