Should fix tsan errors in utvideoenc_rgb_left and related tests.
Ronald S. Bultje authored on 2017/05/25 21:20:21... | ... |
@@ -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 |
} |