stratosphere: Use RAII for locks

This renames the Mutex class member functions so that the mutex types
satisfy Lockable.

This makes them usable with standard std::scoped_lock
and std::unique_lock, which lets us use RAII and avoids the need
for a custom RAII wrapper :)
This commit is contained in:
Léo Lam 2018-07-02 16:10:57 +02:00 committed by SciresM
parent 8e29e70a61
commit f4212ff213
3 changed files with 13 additions and 16 deletions

View File

@ -9,15 +9,15 @@ class HosMutex {
mutexInit(&this->m); mutexInit(&this->m);
} }
void Lock() { void lock() {
mutexLock(&this->m); mutexLock(&this->m);
} }
void Unlock() { void unlock() {
mutexUnlock(&this->m); mutexUnlock(&this->m);
} }
bool TryLock() { bool try_lock() {
return mutexTryLock(&this->m); return mutexTryLock(&this->m);
} }
}; };
@ -30,15 +30,15 @@ class HosRecursiveMutex {
rmutexInit(&this->m); rmutexInit(&this->m);
} }
void Lock() { void lock() {
rmutexLock(&this->m); rmutexLock(&this->m);
} }
void Unlock() { void unlock() {
rmutexUnlock(&this->m); rmutexUnlock(&this->m);
} }
bool TryLock() { bool try_lock() {
return rmutexTryLock(&this->m); return rmutexTryLock(&this->m);
} }
}; };

View File

@ -2,6 +2,7 @@
#include <algorithm> #include <algorithm>
#include <functional> #include <functional>
#include <mutex>
#include <stratosphere/multithreadedwaitablemanager.hpp> #include <stratosphere/multithreadedwaitablemanager.hpp>
@ -20,11 +21,10 @@ void MultiThreadedWaitableManager::process_until_timeout() {
} }
void MultiThreadedWaitableManager::add_waitable(IWaitable *waitable) { void MultiThreadedWaitableManager::add_waitable(IWaitable *waitable) {
this->lock.Lock(); std::scoped_lock lk{this->lock};
this->to_add_waitables.push_back(waitable); this->to_add_waitables.push_back(waitable);
waitable->set_manager(this); waitable->set_manager(this);
this->new_waitable_event->signal_event(); this->new_waitable_event->signal_event();
this->lock.Unlock();
} }
@ -33,7 +33,7 @@ IWaitable *MultiThreadedWaitableManager::get_waitable() {
int handle_index = 0; int handle_index = 0;
Result rc; Result rc;
this->get_waitable_lock.Lock(); std::scoped_lock lk{this->get_waitable_lock};
while (1) { while (1) {
/* Sort waitables by priority. */ /* Sort waitables by priority. */
std::sort(this->waitables.begin(), this->waitables.end(), IWaitable::compare); std::sort(this->waitables.begin(), this->waitables.end(), IWaitable::compare);
@ -71,7 +71,6 @@ IWaitable *MultiThreadedWaitableManager::get_waitable() {
w->handle_signaled(0); w->handle_signaled(0);
this->waitables.push_back(w); this->waitables.push_back(w);
} else { } else {
this->get_waitable_lock.Unlock();
return w; return w;
} }
} }
@ -81,10 +80,9 @@ IWaitable *MultiThreadedWaitableManager::get_waitable() {
Result MultiThreadedWaitableManager::add_waitable_callback(void *arg, Handle *handles, size_t num_handles, u64 timeout) { Result MultiThreadedWaitableManager::add_waitable_callback(void *arg, Handle *handles, size_t num_handles, u64 timeout) {
MultiThreadedWaitableManager *this_ptr = (MultiThreadedWaitableManager *)arg; MultiThreadedWaitableManager *this_ptr = (MultiThreadedWaitableManager *)arg;
svcClearEvent(handles[0]); svcClearEvent(handles[0]);
this_ptr->lock.Lock(); std::scoped_lock lk{this_ptr->lock};
this_ptr->waitables.insert(this_ptr->waitables.end(), this_ptr->to_add_waitables.begin(), this_ptr->to_add_waitables.end()); this_ptr->waitables.insert(this_ptr->waitables.end(), this_ptr->to_add_waitables.begin(), this_ptr->to_add_waitables.end());
this_ptr->to_add_waitables.clear(); this_ptr->to_add_waitables.clear();
this_ptr->lock.Unlock();
return 0; return 0;
} }

View File

@ -2,15 +2,15 @@
#include <algorithm> #include <algorithm>
#include <functional> #include <functional>
#include <mutex>
#include <stratosphere/waitablemanager.hpp> #include <stratosphere/waitablemanager.hpp>
void WaitableManager::add_waitable(IWaitable *waitable) { void WaitableManager::add_waitable(IWaitable *waitable) {
this->lock.Lock(); std::scoped_lock lk{this->lock};
this->to_add_waitables.push_back(waitable); this->to_add_waitables.push_back(waitable);
waitable->set_manager(this); waitable->set_manager(this);
this->has_new_items = true; this->has_new_items = true;
this->lock.Unlock();
} }
void WaitableManager::process_internal(bool break_on_timeout) { void WaitableManager::process_internal(bool break_on_timeout) {
@ -22,11 +22,10 @@ void WaitableManager::process_internal(bool break_on_timeout) {
while (1) { while (1) {
/* Add new items, if relevant. */ /* Add new items, if relevant. */
if (this->has_new_items) { if (this->has_new_items) {
this->lock.Lock(); std::scoped_lock lk{this->lock};
this->waitables.insert(this->waitables.end(), this->to_add_waitables.begin(), this->to_add_waitables.end()); this->waitables.insert(this->waitables.end(), this->to_add_waitables.begin(), this->to_add_waitables.end());
this->to_add_waitables.clear(); this->to_add_waitables.clear();
this->has_new_items = false; this->has_new_items = false;
this->lock.Unlock();
} }
/* Sort waitables by priority. */ /* Sort waitables by priority. */