diff options
author | Lioncash <mathew1800@gmail.com> | 2018-07-21 20:51:37 +0200 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2018-07-21 20:51:44 +0200 |
commit | 973fdce79b191b5c2887a0e410979be84ae995f4 (patch) | |
tree | bb0c810852c16196049f3eb6aeb2333bd312c029 /src/common/synchronized_wrapper.h | |
parent | Merge pull request #746 from lioncash/tests (diff) | |
download | yuzu-973fdce79b191b5c2887a0e410979be84ae995f4.tar yuzu-973fdce79b191b5c2887a0e410979be84ae995f4.tar.gz yuzu-973fdce79b191b5c2887a0e410979be84ae995f4.tar.bz2 yuzu-973fdce79b191b5c2887a0e410979be84ae995f4.tar.lz yuzu-973fdce79b191b5c2887a0e410979be84ae995f4.tar.xz yuzu-973fdce79b191b5c2887a0e410979be84ae995f4.tar.zst yuzu-973fdce79b191b5c2887a0e410979be84ae995f4.zip |
Diffstat (limited to '')
-rw-r--r-- | src/common/synchronized_wrapper.h | 85 |
1 files changed, 0 insertions, 85 deletions
diff --git a/src/common/synchronized_wrapper.h b/src/common/synchronized_wrapper.h deleted file mode 100644 index 4a1984c46..000000000 --- a/src/common/synchronized_wrapper.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2015 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include <algorithm> -#include <mutex> - -namespace Common { - -template <typename T> -class SynchronizedWrapper; - -/** - * Synchronized reference, that keeps a SynchronizedWrapper's mutex locked during its lifetime. This - * greatly reduces the chance that someone will access the wrapped resource without locking the - * mutex. - */ -template <typename T> -class SynchronizedRef { -public: - SynchronizedRef(SynchronizedWrapper<T>& wrapper) : wrapper(&wrapper) { - wrapper.mutex.lock(); - } - - SynchronizedRef(SynchronizedRef&) = delete; - SynchronizedRef(SynchronizedRef&& o) : wrapper(o.wrapper) { - o.wrapper = nullptr; - } - - ~SynchronizedRef() { - if (wrapper) - wrapper->mutex.unlock(); - } - - SynchronizedRef& operator=(SynchronizedRef&) = delete; - SynchronizedRef& operator=(SynchronizedRef&& o) { - std::swap(wrapper, o.wrapper); - return *this; - } - - T& operator*() { - return wrapper->data; - } - const T& operator*() const { - return wrapper->data; - } - - T* operator->() { - return &wrapper->data; - } - const T* operator->() const { - return &wrapper->data; - } - -private: - 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 |