Skip to content

threading: Fix a race around frame completion (frame-mt)

Victorien Le Couviour--Tuffet requested to merge psilokos/dav1d:fix-hang into master

The completion of the first frame to decode while an async reset request on that same frame is pending will render it stale. The processing of such a stale request is likely to result in a hang.

One reason this happens is the skip condition at the beginning of reset_task_cur().

=> Consume the async request before that check.

Another reason is several threads producing async reset requests in parallel: an async request for the first frame could cascade through the other threads (other frames) during completion of that frame, meaning not being caught by the last synchronous reset_task_cur() after signaling the main thread and before releasing the lock.

=> To solve this we need to add protections at the racy locations. That means after we increase first, before returning from reset_task_cur_async(), and after consuming the async request.

Edited by Victorien Le Couviour--Tuffet

Merge request reports