From: R��mi Bernon <rbernon(a)codeweavers.com> --- dlls/winegstreamer/wm_asyncreader.c | 52 +++++++++++++++++------------ 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 4d774cc2c62..bbc9130ddc2 100644 --- a/dlls/winegstreamer/wm_asyncreader.c +++ b/dlls/winegstreamer/wm_asyncreader.c @@ -269,9 +269,24 @@ static HRESULT async_reader_queue_op(struct async_reader *reader, enum async_op_ return S_OK; } -static void async_reader_close(struct async_reader *reader) +static void async_reader_close(struct async_reader *reader, bool force) { struct async_op *op, *next; + HRESULT hr; + + if (!force && FAILED(hr = async_reader_queue_op(reader, ASYNC_OP_CLOSE, NULL))) + { + ERR("Failed to queue close op, hr %#lx\n", hr); + force = true; + } + + if (force) + { + EnterCriticalSection(&reader->callback_cs); + reader->running = false; + LeaveCriticalSection(&reader->callback_cs); + WakeConditionVariable(&reader->callback_cv); + } if (reader->callback_thread) { @@ -285,24 +300,29 @@ static void async_reader_close(struct async_reader *reader) list_remove(&op->entry); free(op); } + + if (reader->callback) + IWMReaderCallback_Release(reader->callback); + reader->callback = NULL; + reader->context = NULL; } static HRESULT async_reader_open(struct async_reader *reader, IWMReaderCallback *callback, void *context) { + HRESULT hr = E_OUTOFMEMORY; + IWMReaderCallback_AddRef((reader->callback = callback)); reader->context = context; reader->running = true; if (!(reader->callback_thread = CreateThread(NULL, 0, async_reader_callback_thread, reader, 0, NULL))) - { - IWMReaderCallback_Release(reader->callback); - reader->running = false; - reader->callback = NULL; - reader->context = NULL; - return E_OUTOFMEMORY; - } + goto error; return S_OK; + +error: + async_reader_close(reader, true); + return hr; } static struct async_reader *impl_from_IWMReader(IWMReader *iface) @@ -366,13 +386,9 @@ static HRESULT WINAPI WMReader_Close(IWMReader *iface) EnterCriticalSection(&reader->reader.cs); - async_reader_queue_op(reader, ASYNC_OP_CLOSE, NULL); - async_reader_close(reader); + async_reader_close(reader, false); hr = wm_reader_close(&reader->reader); - if (reader->callback) - IWMReaderCallback_Release(reader->callback); - reader->callback = NULL; LeaveCriticalSection(&reader->reader.cs); @@ -1686,21 +1702,13 @@ static void async_reader_destroy(struct wm_reader *iface) TRACE("reader %p.\n", reader); - EnterCriticalSection(&reader->callback_cs); - reader->running = false; - LeaveCriticalSection(&reader->callback_cs); - WakeConditionVariable(&reader->callback_cv); - - async_reader_close(reader); + async_reader_close(reader, true); reader->callback_cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&reader->callback_cs); wm_reader_close(&reader->reader); - if (reader->callback) - IWMReaderCallback_Release(reader->callback); - wm_reader_cleanup(&reader->reader); free(reader); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/695