summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-07-21 18:30:31 -0700
committerGravatar GitHub2018-07-21 18:30:31 -0700
commitf5e87f4ce19d7841452a1fb2ec3d9233d1dfae81 (patch)
treeac3301f5909be43b2d2602938927eaf1272ad0ce /src
parentMerge pull request #760 from lioncash/path (diff)
parentcommon: Remove synchronized_wrapper.h (diff)
downloadyuzu-f5e87f4ce19d7841452a1fb2ec3d9233d1dfae81.tar.gz
yuzu-f5e87f4ce19d7841452a1fb2ec3d9233d1dfae81.tar.xz
yuzu-f5e87f4ce19d7841452a1fb2ec3d9233d1dfae81.zip
Merge pull request #758 from lioncash/sync
common: Remove synchronized_wrapper.h
Diffstat (limited to '')
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/synchronized_wrapper.h85
2 files changed, 0 insertions, 86 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index f49a31612..d5d4f6f82 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -63,7 +63,6 @@ add_library(common STATIC
63 string_util.cpp 63 string_util.cpp
64 string_util.h 64 string_util.h
65 swap.h 65 swap.h
66 synchronized_wrapper.h
67 telemetry.cpp 66 telemetry.cpp
68 telemetry.h 67 telemetry.h
69 thread.cpp 68 thread.cpp
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