diff options
Diffstat (limited to 'src/common/synchronized_wrapper.h')
| -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 @@ | |||
| 1 | // Copyright 2015 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <algorithm> | ||
| 8 | #include <mutex> | ||
| 9 | |||
| 10 | namespace Common { | ||
| 11 | |||
| 12 | template <typename T> | ||
| 13 | class SynchronizedWrapper; | ||
| 14 | |||
| 15 | /** | ||
| 16 | * Synchronized reference, that keeps a SynchronizedWrapper's mutex locked during its lifetime. This | ||
| 17 | * greatly reduces the chance that someone will access the wrapped resource without locking the | ||
| 18 | * mutex. | ||
| 19 | */ | ||
| 20 | template <typename T> | ||
| 21 | class SynchronizedRef { | ||
| 22 | public: | ||
| 23 | SynchronizedRef(SynchronizedWrapper<T>& wrapper) : wrapper(&wrapper) { | ||
| 24 | wrapper.mutex.lock(); | ||
| 25 | } | ||
| 26 | |||
| 27 | SynchronizedRef(SynchronizedRef&) = delete; | ||
| 28 | SynchronizedRef(SynchronizedRef&& o) : wrapper(o.wrapper) { | ||
| 29 | o.wrapper = nullptr; | ||
| 30 | } | ||
| 31 | |||
| 32 | ~SynchronizedRef() { | ||
| 33 | if (wrapper) | ||
| 34 | wrapper->mutex.unlock(); | ||
| 35 | } | ||
| 36 | |||
| 37 | SynchronizedRef& operator=(SynchronizedRef&) = delete; | ||
| 38 | SynchronizedRef& operator=(SynchronizedRef&& o) { | ||
| 39 | std::swap(wrapper, o.wrapper); | ||
| 40 | return *this; | ||
| 41 | } | ||
| 42 | |||
| 43 | T& operator*() { | ||
| 44 | return wrapper->data; | ||
| 45 | } | ||
| 46 | const T& operator*() const { | ||
| 47 | return wrapper->data; | ||
| 48 | } | ||
| 49 | |||
| 50 | T* operator->() { | ||
| 51 | return &wrapper->data; | ||
| 52 | } | ||
| 53 | const T* operator->() const { | ||
| 54 | return &wrapper->data; | ||
| 55 | } | ||
| 56 | |||
| 57 | private: | ||
| 58 | SynchronizedWrapper<T>* wrapper; | ||
| 59 | }; | ||
| 60 | |||
| 61 | /** | ||
| 62 | * Wraps an object, only allowing access to it via a locking reference wrapper. Good to ensure no | ||
| 63 | * one forgets to lock a mutex before acessing an object. To access the wrapped object construct a | ||
| 64 | * SyncronizedRef on this wrapper. Inspired by Rust's Mutex type | ||
| 65 | * (http://doc.rust-lang.org/std/sync/struct.Mutex.html). | ||
| 66 | */ | ||
| 67 | template <typename T> | ||
| 68 | class SynchronizedWrapper { | ||
| 69 | public: | ||
| 70 | template <typename... Args> | ||
| 71 | SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {} | ||
| 72 | |||
| 73 | SynchronizedRef<T> Lock() { | ||
| 74 | return {*this}; | ||
| 75 | } | ||
| 76 | |||
| 77 | private: | ||
| 78 | template <typename U> | ||
| 79 | friend class SynchronizedRef; | ||
| 80 | |||
| 81 | std::mutex mutex; | ||
| 82 | T data; | ||
| 83 | }; | ||
| 84 | |||
| 85 | } // namespace Common | ||