d3d11ipcsink: Fix deadlock on stop

Manually close connection if client does not hold any shared memory
on stop.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5747>
This commit is contained in:
Seungha Yang 2023-12-01 21:15:00 +09:00 committed by GStreamer Marge Bot
parent b168647073
commit ed5987efd4

View file

@ -521,14 +521,34 @@ gst_d3d11_ipc_server_on_idle (GstD3D11IpcServer * self)
GST_DEBUG_OBJECT (self, "Have %" G_GSIZE_FORMAT " alive connections", GST_DEBUG_OBJECT (self, "Have %" G_GSIZE_FORMAT " alive connections",
priv->conn_map.size()); priv->conn_map.size());
size_t num_closed = 0;
for (auto it : priv->conn_map) { for (auto it : priv->conn_map) {
auto conn = it.second; auto conn = it.second;
GST_DEBUG_OBJECT (self, "conn-id %u" GST_DEBUG_OBJECT (self, "conn-id %u"
" peer handle size %" G_GSIZE_FORMAT, conn->id, " peer handle size %" G_GSIZE_FORMAT, conn->id,
conn->peer_handles.size ()); conn->peer_handles.size ());
/* Cannot erase conn since it's still referenced.
* Manually close connection */
if (conn->peer_handles.empty ()) {
if (conn->pipe != INVALID_HANDLE_VALUE) {
CancelIo (conn->pipe);
DisconnectNamedPipe (conn->pipe);
CloseHandle (conn->pipe);
conn->pipe = INVALID_HANDLE_VALUE;
}
num_closed++;
}
} }
/* *INDENT-ON* */ /* *INDENT-ON* */
if (priv->conn_map.size () == num_closed) {
GST_DEBUG_OBJECT (self, "All connections were closed");
SetEvent (priv->cancellable);
}
return; return;
} }