Browse code

frame_thread_encoder: extend critical code covered by finished_task_mutex.

Should fix tsan errors in utvideoenc_rgb_left and related tests.

Ronald S. Bultje authored on 2017/05/25 21:20:21
Showing 1 changed files
... ...
@@ -272,15 +272,16 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF
272 272
         pthread_mutex_unlock(&c->task_fifo_mutex);
273 273
 
274 274
         c->task_index = (c->task_index+1) % BUFFER_SIZE;
275
-
276
-        if(!c->finished_tasks[c->finished_task_index].outdata && (c->task_index - c->finished_task_index) % BUFFER_SIZE <= avctx->thread_count)
277
-            return 0;
278 275
     }
279 276
 
280
-    if(c->task_index == c->finished_task_index)
281
-        return 0;
282
-
283 277
     pthread_mutex_lock(&c->finished_task_mutex);
278
+    if (c->task_index == c->finished_task_index ||
279
+        (frame && !c->finished_tasks[c->finished_task_index].outdata &&
280
+         (c->task_index - c->finished_task_index) % BUFFER_SIZE <= avctx->thread_count)) {
281
+            pthread_mutex_unlock(&c->finished_task_mutex);
282
+            return 0;
283
+        }
284
+
284 285
     while (!c->finished_tasks[c->finished_task_index].outdata) {
285 286
         pthread_cond_wait(&c->finished_task_cond, &c->finished_task_mutex);
286 287
     }