diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2024-01-25 22:21:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-25 22:21:38 +0100 |
commit | e04368ad7cf4c8d8820ef4da451d9954ff38cb2d (patch) | |
tree | be7e40d1bcd44304eff90e6e5a7a49c02628111e /src/core/hle/service | |
parent | Merge pull request #12777 from t895/firmware-warning (diff) | |
parent | nvservices: close map handles on session close (diff) | |
download | yuzu-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.cpp | 1 | ||||
-rw-r--r-- | src/core/hle/service/nvdrv/core/nvmap.cpp | 13 | ||||
-rw-r--r-- | src/core/hle/service/nvdrv/core/nvmap.h | 2 |
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` |