[PATCH 2/2] wineoss: Don't acquire the sessions lock after the client lock.
Andrew Eikum
aeikum at codeweavers.com
Fri Dec 3 09:15:52 CST 2021
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Thu, Dec 02, 2021 at 12:02:39PM +0000, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
> dlls/wineoss.drv/mmdevdrv.c | 13 ++++++++-----
> 1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
> index 19a59cd9ba1..b340db00c3c 100644
> --- a/dlls/wineoss.drv/mmdevdrv.c
> +++ b/dlls/wineoss.drv/mmdevdrv.c
> @@ -1085,22 +1085,26 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
> }
> }
>
> + EnterCriticalSection(&g_sessions_lock);
> EnterCriticalSection(&This->lock);
>
> if(This->initted){
> LeaveCriticalSection(&This->lock);
> + LeaveCriticalSection(&g_sessions_lock);
> return AUDCLNT_E_ALREADY_INITIALIZED;
> }
>
> hr = setup_oss_device(mode, This->fd, fmt, NULL);
> if(FAILED(hr)){
> LeaveCriticalSection(&This->lock);
> + LeaveCriticalSection(&g_sessions_lock);
> return hr;
> }
>
> This->fmt = clone_format(fmt);
> if(!This->fmt){
> LeaveCriticalSection(&This->lock);
> + LeaveCriticalSection(&g_sessions_lock);
> return E_OUTOFMEMORY;
> }
>
> @@ -1116,6 +1120,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
> CoTaskMemFree(This->fmt);
> This->fmt = NULL;
> LeaveCriticalSection(&This->lock);
> + LeaveCriticalSection(&g_sessions_lock);
> return E_OUTOFMEMORY;
> }
>
> @@ -1124,6 +1129,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
> CoTaskMemFree(This->fmt);
> This->fmt = NULL;
> LeaveCriticalSection(&This->lock);
> + LeaveCriticalSection(&g_sessions_lock);
> return E_OUTOFMEMORY;
> }
>
> @@ -1134,27 +1140,24 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
> This->flags = flags;
> This->oss_bufsize_bytes = 0;
>
> - EnterCriticalSection(&g_sessions_lock);
> -
> hr = get_audio_session(sessionguid, This->parent, fmt->nChannels,
> &This->session);
> if(FAILED(hr)){
> - LeaveCriticalSection(&g_sessions_lock);
> HeapFree(GetProcessHeap(), 0, This->vols);
> This->vols = NULL;
> CoTaskMemFree(This->fmt);
> This->fmt = NULL;
> LeaveCriticalSection(&This->lock);
> + LeaveCriticalSection(&g_sessions_lock);
> return hr;
> }
>
> list_add_tail(&This->session->clients, &This->entry);
>
> - LeaveCriticalSection(&g_sessions_lock);
> -
> This->initted = TRUE;
>
> LeaveCriticalSection(&This->lock);
> + LeaveCriticalSection(&g_sessions_lock);
>
> return S_OK;
> }
> --
> 2.23.0
>
>
More information about the wine-devel
mailing list