[PATCH v5 0/6] MR140: qasf: More ASF reader filter implementation.
Zebediah Figura
zfigura at codeweavers.com
Tue Jul 5 13:38:14 CDT 2022
On 7/5/22 00:46, Rémi Bernon (@rbernon) wrote:
> On Mon Jul 4 20:26:47 2022 +0000, **** wrote:
>> Zebediah Figura replied on the mailing list:
>> ```
>> On 6/15/22 01:58, Rémi Bernon wrote:
>>> +static HRESULT asf_reader_init_stream(struct strmbase_filter *iface)
>>> +{
>>> + struct asf_reader *filter = impl_from_strmbase_filter(iface);
>>> + HRESULT hr;
>>> + int i;
>>> +
>>> + TRACE("iface %p\n", iface);
>>> +
>>> + for (i = 0; i < filter->stream_count; ++i)
>>> + {
>>> + struct asf_stream *stream = filter->streams + i;
>>> +
>>> + if (!stream->source.pin.peer)
>>> + continue;
>>> +
>>> + hr = IMemAllocator_Commit(stream->source.pAllocator);
>>> + if (FAILED(hr))
>>> + {
>>> + WARN("Failed to commit stream %u allocator, hr %#lx\n",
>> i, hr);
>>> + continue;
>>> + }
>>> +
>>> + hr = IPin_NewSegment(stream->source.pin.peer, 0, 0, 1);
>>> + if (FAILED(hr))
>>> + {
>>> + WARN("Failed to start stream %u new segment, hr %#lx\n",
>> i, hr);
>>> + continue;
>>> + }
>>> + }
>>> +
>>> + return IWMReader_Start(filter->reader, 0, 0, 1, NULL);
>>> +}
>>> +
>>> +static HRESULT asf_reader_cleanup_stream(struct strmbase_filter *iface)
>>> +{
>>> + struct asf_reader *filter = impl_from_strmbase_filter(iface);
>>> + int i;
>>> +
>>> + TRACE("iface %p\n", iface);
>> Shouldn't the reader be stopped here?
>> ```
> Maybe, but it causes all sort of deadlocks which I've stopped trying to fix, and in practice it seems to work without it.
>
> The deadlock is because `WMReader_Stop` calling `stop_streaming` which needs to enter the streaming thread CS to stop it, and then waits for it.
We don't wait for the streaming thread while holding stream_cs, though.
Do you mean the reader CS? If we're taking the reader CS from the stream
thread, that's also a bug that'll need to be solved somehow.
>
> It can either be that the streaming thread is blocked in `wm_reader_get_stream_sample`, which, for some reason may be waiting for samples which never come.
If that's happening there's a bug, I think. If we're EOS then
wm_reader_get_stream_sample() should return immediately.
>
> Or, that the streaming thread calls the callbacks before exiting, and that the callbacks need to enter the filter CS, which is currently held by asf_reader_cleanup_stream. For instance either because there's a sample that's been received, or because of the `WMT_END_OF_STREAMING` notification.
There's a (unfortunately as yet unwritten) rule that nothing from the
streaming thread is allowed to ever grab the filter CS.
I failed to notice this during review the first time, but that means
that patch 3/7 is broken. It shouldn't be necessary to take the filter
CS, though, since pin connection state can't change while the filter is
running.
More information about the wine-devel
mailing list