[PATCH 0/1] MR10320: win32u/d3dkmt: Close the wait handle with NtClose() in NtGdiDdDDIAcquireKeyedMutex2().
When a waitable handle is created and closed in the server, close_inproc_sync() must be explicitly called for cache cleanup in ntdll, but this function is only available in ntdll. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10320
From: Conor McCarthy <cmccarthy@codeweavers.com> When a waitable handle is created and closed in the server, close_inproc_sync() must be explicitly called for cache cleanup in ntdll, but this function is only available in ntdll. --- dlls/win32u/d3dkmt.c | 4 +++- server/d3dkmt.c | 9 ++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 8826c2a4bd0..c7c831d3952 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -1604,7 +1604,9 @@ NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex2( D3DKMT_ACQUIREKEYEDMUTEX2 *params status = wine_server_call( req ); params->FenceValue = reply->fence_value; - wait_handle = wine_server_ptr_handle( reply->wait_handle ); + /* server never creates a new handle if one is provided, and always returns a handle if pending */ + if (reply->wait_handle) wait_handle = wine_server_ptr_handle( reply->wait_handle ); + else if (wait_handle) NtClose( wait_handle ); } SERVER_END_REQ; } while (status == STATUS_PENDING); diff --git a/server/d3dkmt.c b/server/d3dkmt.c index afa96bf2ac6..e913e112911 100644 --- a/server/d3dkmt.c +++ b/server/d3dkmt.c @@ -752,7 +752,7 @@ DECL_HANDLER(d3dkmt_mutex_acquire) struct d3dkmt_mutex *mutex; struct object *sync; - if (!(mutex = d3dkmt_object_open( req->mutex, D3DKMT_MUTEX ))) goto done; + if (!(mutex = d3dkmt_object_open( req->mutex, D3DKMT_MUTEX ))) return; if (req->wait_status) set_error( req->wait_status ); else if (mutex->abandoned) set_error( STATUS_ABANDONED ); @@ -770,12 +770,7 @@ DECL_HANDLER(d3dkmt_mutex_acquire) release_object( mutex ); -done: - if (get_error() != STATUS_PENDING && req->wait_handle) - { - close_handle( current->process, req->wait_handle ); - if (mutex) keyed_wait_release( mutex, req->key_value ); - } + if (get_error() != STATUS_PENDING && req->wait_handle) keyed_wait_release( mutex, req->key_value ); } /* Release a global d3dkmt keyed mutex */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10320
This merge request was approved by Rémi Bernon. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10320
participants (3)
-
Conor McCarthy -
Conor McCarthy (@cmccarthy) -
Rémi Bernon