diff --git a/src/xenia/kernel/xam/content_manager.cc b/src/xenia/kernel/xam/content_manager.cc index 270c5eb64..5e90e27f8 100644 --- a/src/xenia/kernel/xam/content_manager.cc +++ b/src/xenia/kernel/xam/content_manager.cc @@ -41,8 +41,9 @@ ContentPackage::ContentPackage(KernelState* kernel_state, std::string root_name, } ContentPackage::~ContentPackage() { - kernel_state_->file_system()->UnregisterSymbolicLink(root_name_ + ":"); - // TODO(benvanik): unregister device. + auto fs = kernel_state_->file_system(); + fs->UnregisterSymbolicLink(root_name_ + ":"); + fs->UnregisterDevice(device_path_); } ContentManager::ContentManager(KernelState* kernel_state, diff --git a/src/xenia/vfs/virtual_file_system.cc b/src/xenia/vfs/virtual_file_system.cc index 3f3c3d638..951ea032c 100644 --- a/src/xenia/vfs/virtual_file_system.cc +++ b/src/xenia/vfs/virtual_file_system.cc @@ -32,8 +32,20 @@ bool VirtualFileSystem::RegisterDevice(std::unique_ptr device) { return true; } -bool VirtualFileSystem::RegisterSymbolicLink(std::string path, - std::string target) { +bool VirtualFileSystem::UnregisterDevice(const std::string& path) { + auto global_lock = global_critical_region_.Acquire(); + for (auto it = devices_.begin(); it != devices_.end(); ++it) { + if ((*it)->mount_path() == path) { + XELOGD("Unregistered device: %s", (*it)->mount_path().c_str()); + devices_.erase(it); + return true; + } + } + return false; +} + +bool VirtualFileSystem::RegisterSymbolicLink(const std::string& path, + const std::string& target) { auto global_lock = global_critical_region_.Acquire(); symlinks_.insert({path, target}); XELOGD("Registered symbolic link: %s => %s", path.c_str(), target.c_str()); @@ -41,7 +53,7 @@ bool VirtualFileSystem::RegisterSymbolicLink(std::string path, return true; } -bool VirtualFileSystem::UnregisterSymbolicLink(std::string path) { +bool VirtualFileSystem::UnregisterSymbolicLink(const std::string& path) { auto global_lock = global_critical_region_.Acquire(); auto it = symlinks_.find(path); if (it == symlinks_.end()) { @@ -63,7 +75,7 @@ bool VirtualFileSystem::IsSymbolicLink(const std::string& path) { return true; } -Entry* VirtualFileSystem::ResolvePath(std::string path) { +Entry* VirtualFileSystem::ResolvePath(const std::string& path) { auto global_lock = global_critical_region_.Acquire(); // Resolve relative paths @@ -120,12 +132,13 @@ Entry* VirtualFileSystem::ResolvePath(std::string path) { return nullptr; } -Entry* VirtualFileSystem::ResolveBasePath(std::string path) { +Entry* VirtualFileSystem::ResolveBasePath(const std::string& path) { auto base_path = xe::find_base_path(path); return ResolvePath(base_path); } -Entry* VirtualFileSystem::CreatePath(std::string path, uint32_t attributes) { +Entry* VirtualFileSystem::CreatePath(const std::string& path, + uint32_t attributes) { // Create all required directories recursively. auto path_parts = xe::split_path(path); if (path_parts.empty()) { @@ -153,7 +166,7 @@ Entry* VirtualFileSystem::CreatePath(std::string path, uint32_t attributes) { attributes); } -bool VirtualFileSystem::DeletePath(std::string path) { +bool VirtualFileSystem::DeletePath(const std::string& path) { auto entry = ResolvePath(path); if (!entry) { return false; @@ -166,7 +179,7 @@ bool VirtualFileSystem::DeletePath(std::string path) { return parent->Delete(entry); } -X_STATUS VirtualFileSystem::OpenFile(std::string path, +X_STATUS VirtualFileSystem::OpenFile(const std::string& path, FileDisposition creation_disposition, uint32_t desired_access, File** out_file, FileAction* out_action) { diff --git a/src/xenia/vfs/virtual_file_system.h b/src/xenia/vfs/virtual_file_system.h index f7d23190a..4eb0fb27d 100644 --- a/src/xenia/vfs/virtual_file_system.h +++ b/src/xenia/vfs/virtual_file_system.h @@ -29,18 +29,20 @@ class VirtualFileSystem { ~VirtualFileSystem(); bool RegisterDevice(std::unique_ptr device); + bool UnregisterDevice(const std::string& path); - bool RegisterSymbolicLink(std::string path, std::string target); - bool UnregisterSymbolicLink(std::string path); + bool RegisterSymbolicLink(const std::string& path, const std::string& target); + bool UnregisterSymbolicLink(const std::string& path); bool IsSymbolicLink(const std::string& path); - Entry* ResolvePath(std::string path); - Entry* ResolveBasePath(std::string path); + Entry* ResolvePath(const std::string& path); + Entry* ResolveBasePath(const std::string& path); - Entry* CreatePath(std::string path, uint32_t attributes); - bool DeletePath(std::string path); + Entry* CreatePath(const std::string& path, uint32_t attributes); + bool DeletePath(const std::string& path); - X_STATUS OpenFile(std::string path, FileDisposition creation_disposition, + X_STATUS OpenFile(const std::string& path, + FileDisposition creation_disposition, uint32_t desired_access, File** out_file, FileAction* out_action);