Zhiyi Zhang (@zhiyi) commented about dlls/rtworkq/queue.c:
+ { + /* This means the callback wasn't run during our wait, so we can invoke the + * callback with a canceled status, and release the work item. */ + if ((key & WAIT_ITEM_KEY_MASK) == WAIT_ITEM_KEY_MASK) + { + IRtwqAsyncResult_SetStatus(item->result, RTWQ_E_OPERATION_CANCELLED); + invoke_async_callback(item->result); + } + IUnknown_Release(&item->IUnknown_iface); + } + IUnknown_Release(&item->IUnknown_iface); hr = S_OK; break; } } - LeaveCriticalSection(&queue->cs); If key is not found, queue->cs is not released.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/4243#note_64606