DANGER DANGER. Switching to global critical region.

This changes almost all locks held by guest threads to use a single global
critical region. This emulates the behavior on the PPC of disabling
interrupts (by calls like KeRaiseIrqlToDpcLevel or masking interrupts),
and prevents deadlocks from occuring when threads are suspended or
otherwise blocked.
This has performance implications and a pass is needed to ensure the
locking is as granular as possible. It could also break everything
because it's fundamentally unsound. We'll see.
This commit is contained in:
Ben Vanik
2015-09-06 09:30:54 -07:00
parent 33270cd2a0
commit 3c96b6fa0a
50 changed files with 271 additions and 219 deletions

View File

@@ -27,20 +27,20 @@ VirtualFileSystem::~VirtualFileSystem() {
}
bool VirtualFileSystem::RegisterDevice(std::unique_ptr<Device> device) {
std::lock_guard<xe::mutex> lock(mutex_);
auto global_lock = global_critical_region_.Acquire();
devices_.emplace_back(std::move(device));
return true;
}
bool VirtualFileSystem::RegisterSymbolicLink(std::string path,
std::string target) {
std::lock_guard<xe::mutex> lock(mutex_);
auto global_lock = global_critical_region_.Acquire();
symlinks_.insert({path, target});
return true;
}
bool VirtualFileSystem::UnregisterSymbolicLink(std::string path) {
std::lock_guard<xe::mutex> lock(mutex_);
auto global_lock = global_critical_region_.Acquire();
auto it = symlinks_.find(path);
if (it == symlinks_.end()) {
return false;
@@ -50,7 +50,7 @@ bool VirtualFileSystem::UnregisterSymbolicLink(std::string path) {
}
Entry* VirtualFileSystem::ResolvePath(std::string path) {
std::lock_guard<xe::mutex> lock(mutex_);
auto global_lock = global_critical_region_.Acquire();
// Resolve relative paths
std::string normalized_path(xe::filesystem::CanonicalizePath(path));