[PATCH] winegstreamer: Do not block forever if EOS races with command queue.

Nikolay Sivov nsivov at codeweavers.com
Wed Feb 9 00:27:46 CST 2022



On 2/8/22 22:44, Giovanni Mascellani wrote:
> Hi,
>
> Il 08/02/22 18:50, Zebediah Figura ha scritto:
>> I'm having a hard time understanding the race here. Can 
>> wait_on_sample() be called multiple times concurrently for the same 
>> stream? If not I don't see how it can race with itself.
>
> Consider this flow:
>  * RequestSample() is called: it checks that the stream is not EOS and 
> queues SOURCE_ASYNC_REQUEST_SAMPLE;
>  * while SOURCE_ASYNC_REQUEST_SAMPLE is in the queue, RequestSample() 
> is called again, and another SOURCE_ASYNC_REQUEST_SAMPLE is queued;
>  * the first SOURCE_ASYNC_REQUEST_SAMPLE is executed and 
> wait_on_sample() is called; wg_parser_stream_get_event() happens to 
> find stream->event of type WG_PARSER_EVENT_EOS; it returns that event 
> and reset the event to WG_PARSER_EVENT_NONE; consequently 
> wait_on_sample() issues a MEEndOfStream event;
>  * the second SOURCE_ASYNC_REQUEST_SAMPLE is executed and 
> wait_on_sample() is called; wg_parser_stream_get_event() sees the 
> stream event set to WG_PARSER_EVENT_NONE, and it will never change, 
> therefore it waits forever.
>
> The problem is that the EOS condition must be rechecked inside 
> wh_parser_stream_get_event(), because last time it was checked (in 
> RequestSample()) might be out-of-date.
>
> Does this make sense?

I think this will benefit from some locking, protecting source state.

>
> Thanks, Giovanni.
>




More information about the wine-devel mailing list