diff options
author | Liam <byteslice@airmail.cc> | 2024-01-19 19:52:19 +0100 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2024-01-23 03:18:52 +0100 |
commit | a120f8ff4de31ef4fe34306016e23a94aa2e665d (patch) | |
tree | 85b1849554ee6c18064919ffb71195511bff063d | |
parent | kernel: target invalidate to given process (diff) | |
download | yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar.gz yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar.bz2 yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar.lz yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar.xz yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.tar.zst yuzu-a120f8ff4de31ef4fe34306016e23a94aa2e665d.zip |
-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` |