summaryrefslogtreecommitdiff
path: root/src/common/synchronized_wrapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/synchronized_wrapper.h')
-rw-r--r--src/common/synchronized_wrapper.h85
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
10namespace Common {
11
12template <typename T>
13class 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 */
20template <typename T>
21class SynchronizedRef {
22public:
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
57private:
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 */
67template <typename T>
68class SynchronizedWrapper {
69public:
70 template <typename... Args>
71 SynchronizedWrapper(Args&&... args) : data(std::forward<Args>(args)...) {}
72
73 SynchronizedRef<T> Lock() {
74 return {*this};
75 }
76
77private:
78 template <typename U>
79 friend class SynchronizedRef;
80
81 std::mutex mutex;
82 T data;
83};
84
85} // namespace Common