summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service
diff options
context:
space:
mode:
authorliamwhite <liamwhite@users.noreply.github.com>2024-01-25 22:21:38 +0100
committerGitHub <noreply@github.com>2024-01-25 22:21:38 +0100
commite04368ad7cf4c8d8820ef4da451d9954ff38cb2d (patch)
treebe7e40d1bcd44304eff90e6e5a7a49c02628111e /src/core/hle/service
parentMerge pull request #12777 from t895/firmware-warning (diff)
parentnvservices: close map handles on session close (diff)
downloadyuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar
yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.gz
yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.bz2
yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.lz
yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.xz
yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.zst
yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.zip
Diffstat (limited to 'src/core/hle/service')
-rw-r--r--src/core/hle/service/nvdrv/core/container.cpp1
-rw-r--r--src/core/hle/service/nvdrv/core/nvmap.cpp13
-rw-r--r--src/core/hle/service/nvdrv/core/nvmap.h2
3 files changed, 16 insertions, 0 deletions
diff --git a/src/core/hle/service/nvdrv/core/container.cpp b/src/core/hle/service/nvdrv/core/container.cpp
index 21ef57d27..dc1b4d5be 100644
--- a/src/core/hle/service/nvdrv/core/container.cpp
+++ b/src/core/hle/service/nvdrv/core/container.cpp
@@ -112,6 +112,7 @@ SessionId Container::OpenSession(Kernel::KProcess* process) {
void Container::CloseSession(SessionId session_id) {
std::scoped_lock lk(impl->session_guard);
+ impl->file.UnmapAllHandles(session_id);
auto& session = impl->sessions[session_id.id];
auto& smmu = impl->host1x.MemoryManager();
if (session.has_preallocated_area) {
diff --git a/src/core/hle/service/nvdrv/core/nvmap.cpp b/src/core/hle/service/nvdrv/core/nvmap.cpp
index 1b59c6b15..bc1c033c6 100644
--- a/src/core/hle/service/nvdrv/core/nvmap.cpp
+++ b/src/core/hle/service/nvdrv/core/nvmap.cpp
@@ -326,4 +326,17 @@ std::optional<NvMap::FreeInfo> NvMap::FreeHandle(Handle::Id handle, bool interna
return freeInfo;
}
+void NvMap::UnmapAllHandles(NvCore::SessionId session_id) {
+ auto handles_copy = [&] {
+ std::scoped_lock lk{handles_lock};
+ return handles;
+ }();
+
+ for (auto& [id, handle] : handles_copy) {
+ if (handle->session_id.id == session_id.id) {
+ FreeHandle(id, false);
+ }
+ }
+}
+
} // namespace Service::Nvidia::NvCore
diff --git a/src/core/hle/service/nvdrv/core/nvmap.h b/src/core/hle/service/nvdrv/core/nvmap.h
index d7f695845..b8be599ae 100644
--- a/src/core/hle/service/nvdrv/core/nvmap.h
+++ b/src/core/hle/service/nvdrv/core/nvmap.h
@@ -152,6 +152,8 @@ public:
*/
std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session);
+ void UnmapAllHandles(NvCore::SessionId session_id);
+
private:
std::list<std::shared_ptr<Handle>> unmap_queue{};
std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue`