From 1e3e63a69604c60e14e9a2b23ae27e7cba13f6b2 Mon Sep 17 00:00:00 2001 From: AJ Heller Date: Tue, 13 Feb 2024 00:31:52 -0800 Subject: [PATCH] [EventEngine] Fix lock acquisition ordering problem on Windows Connect --- .../lib/event_engine/windows/windows_engine.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/core/lib/event_engine/windows/windows_engine.cc b/src/core/lib/event_engine/windows/windows_engine.cc index 69e4963f387..7483349ffb8 100644 --- a/src/core/lib/event_engine/windows/windows_engine.cc +++ b/src/core/lib/event_engine/windows/windows_engine.cc @@ -356,10 +356,11 @@ EventEngine::ConnectionHandle WindowsEventEngine::Connect( }); connection_state->timer_handle = RunAfter(timeout, [this, connection_state]() { - grpc_core::MutexLock lock(&connection_state->mu); + grpc_core::ReleasableMutexLock lock(&connection_state->mu); if (CancelConnectFromDeadlineTimer(connection_state.get())) { - connection_state->on_connected_user_callback( - absl::DeadlineExceededError("Connection timed out")); + auto cb = std::move(connection_state->on_connected_user_callback); + lock.Release(); + cb(absl::DeadlineExceededError("Connection timed out")); } // else: The connection attempt could not be canceled. We can assume // the connection callback will be called. @@ -380,8 +381,12 @@ EventEngine::ConnectionHandle WindowsEventEngine::Connect( connection_state->socket->Shutdown(DEBUG_LOCATION, "ConnectEx"); Run([connection_state = std::move(connection_state), status = GRPC_WSA_ERROR(WSAGetLastError(), "ConnectEx")]() mutable { - grpc_core::MutexLock lock(&connection_state->mu); - connection_state->on_connected_user_callback(status); + EventEngine::OnConnectCallback cb; + { + grpc_core::MutexLock lock(&connection_state->mu); + cb = std::move(connection_state->on_connected_user_callback); + } + cb(status); }); return EventEngine::ConnectionHandle::kInvalid; }