Mutex: Replace g_mutex_held_locks with a set inside Thread

This commit is contained in:
Yuri Kunde Schlesner 2015-01-31 19:22:40 -02:00
parent 0f69668fc6
commit 4e84df8be3
3 changed files with 18 additions and 23 deletions

View file

@ -5,6 +5,8 @@
#include <map>
#include <vector>
#include <boost/range/algorithm_ext/erase.hpp>
#include "common/common.h"
#include "core/hle/kernel/kernel.h"
@ -13,9 +15,6 @@
namespace Kernel {
typedef std::multimap<SharedPtr<Thread>, SharedPtr<Mutex>> MutexMap;
static MutexMap g_mutex_held_locks;
/**
* Resumes a thread waiting for the specified mutex
* @param mutex The mutex that some thread is waiting on
@ -33,15 +32,10 @@ static void ResumeWaitingThread(Mutex* mutex) {
}
void ReleaseThreadMutexes(Thread* thread) {
auto locked_range = g_mutex_held_locks.equal_range(thread);
// Release every mutex that the thread holds, and resume execution on the waiting threads
for (auto iter = locked_range.first; iter != locked_range.second; ++iter) {
ResumeWaitingThread(iter->second.get());
for (auto& mtx : thread->held_mutexes) {
ResumeWaitingThread(mtx.get());
}
// Erase all the locks that this thread holds
g_mutex_held_locks.erase(thread);
thread->held_mutexes.clear();
}
ResultVal<SharedPtr<Mutex>> Mutex::Create(bool initial_locked, std::string name) {
@ -76,7 +70,7 @@ void Mutex::Acquire(Thread* thread) {
locked = true;
g_mutex_held_locks.insert(std::make_pair(thread, this));
thread->held_mutexes.insert(this);
holding_thread = thread;
}
@ -84,15 +78,7 @@ void Mutex::Release() {
if (!locked)
return;
auto locked_range = g_mutex_held_locks.equal_range(holding_thread);
for (MutexMap::iterator iter = locked_range.first; iter != locked_range.second; ++iter) {
if (iter->second == this) {
g_mutex_held_locks.erase(iter);
break;
}
}
holding_thread->held_mutexes.erase(this);
ResumeWaitingThread(this);
}