citra-emu
/
citra-canary
Archived
1
0
Fork 0

SynchronizedWrapper: Add Lock convenience method

This commit is contained in:
Yuri Kunde Schlesner 2017-02-18 18:27:37 -08:00
parent 1b28b26682
commit 21f4f49c7a
1 changed files with 25 additions and 18 deletions

View File

@ -9,25 +9,8 @@
namespace Common { namespace Common {
/**
* Wraps an object, only allowing access to it via a locking reference wrapper. Good to ensure no
* one forgets to lock a mutex before acessing an object. To access the wrapped object construct a
* SyncronizedRef on this wrapper. Inspired by Rust's Mutex type
* (http://doc.rust-lang.org/std/sync/struct.Mutex.html).
*/
template <typename T> template <typename T>
class SynchronizedWrapper { class SynchronizedWrapper;
public:
template <typename... Args>
SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {}
private:
template <typename U>
friend class SynchronizedRef;
std::mutex mutex;
T data;
};
/** /**
* Synchronized reference, that keeps a SynchronizedWrapper's mutex locked during its lifetime. This * Synchronized reference, that keeps a SynchronizedWrapper's mutex locked during its lifetime. This
@ -75,4 +58,28 @@ private:
SynchronizedWrapper<T>* wrapper; SynchronizedWrapper<T>* wrapper;
}; };
/**
* Wraps an object, only allowing access to it via a locking reference wrapper. Good to ensure no
* one forgets to lock a mutex before acessing an object. To access the wrapped object construct a
* SyncronizedRef on this wrapper. Inspired by Rust's Mutex type
* (http://doc.rust-lang.org/std/sync/struct.Mutex.html).
*/
template <typename T>
class SynchronizedWrapper {
public:
template <typename... Args>
SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {}
SynchronizedRef<T> Lock() {
return {*this};
}
private:
template <typename U>
friend class SynchronizedRef;
std::mutex mutex;
T data;
};
} // namespace Common } // namespace Common