summary refs log tree commit diff
path: root/pkgs/misc/dxvk/darwin-thread-primitives.patch
blob: c008099407c574bbe0bd73bc6228f066549e0e23 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
diff --git a/src/util/thread.h b/src/util/thread.h
index 28aeca8a..db5c9913 100644
--- a/src/util/thread.h
+++ b/src/util/thread.h
@@ -149,178 +149,8 @@ namespace dxvk {
     }
   }
 
-
-  /**
-   * \brief SRW-based mutex implementation
-   *
-   * Drop-in replacement for \c std::mutex that uses Win32
-   * SRW locks, which are implemented with \c futex in wine.
-   */
-  class mutex {
-
-  public:
-
-    using native_handle_type = PSRWLOCK;
-
-    mutex() { }
-
-    mutex(const mutex&) = delete;
-    mutex& operator = (const mutex&) = delete;
-
-    void lock() {
-      AcquireSRWLockExclusive(&m_lock);
-    }
-
-    void unlock() {
-      ReleaseSRWLockExclusive(&m_lock);
-    }
-
-    bool try_lock() {
-      return TryAcquireSRWLockExclusive(&m_lock);
-    }
-
-    native_handle_type native_handle() {
-      return &m_lock;
-    }
-
-  private:
-
-    SRWLOCK m_lock = SRWLOCK_INIT;
-
-  };
-
-
-  /**
-   * \brief Recursive mutex implementation
-   *
-   * Drop-in replacement for \c std::recursive_mutex that
-   * uses Win32 critical sections.
-   */
-  class recursive_mutex {
-
-  public:
-
-    using native_handle_type = PCRITICAL_SECTION;
-
-    recursive_mutex() {
-      InitializeCriticalSection(&m_lock);
-    }
-
-    ~recursive_mutex() {
-      DeleteCriticalSection(&m_lock);
-    }
-
-    recursive_mutex(const recursive_mutex&) = delete;
-    recursive_mutex& operator = (const recursive_mutex&) = delete;
-
-    void lock() {
-      EnterCriticalSection(&m_lock);
-    }
-
-    void unlock() {
-      LeaveCriticalSection(&m_lock);
-    }
-
-    bool try_lock() {
-      return TryEnterCriticalSection(&m_lock);
-    }
-
-    native_handle_type native_handle() {
-      return &m_lock;
-    }
-
-  private:
-
-    CRITICAL_SECTION m_lock;
-
-  };
-
-
-  /**
-   * \brief SRW-based condition variable implementation
-   *
-   * Drop-in replacement for \c std::condition_variable that
-   * uses Win32 condition variables on SRW locks.
-   */
-  class condition_variable {
-
-  public:
-
-    using native_handle_type = PCONDITION_VARIABLE;
-
-    condition_variable() {
-      InitializeConditionVariable(&m_cond);
-    }
-
-    condition_variable(condition_variable&) = delete;
-
-    condition_variable& operator = (condition_variable&) = delete;
-
-    void notify_one() {
-      WakeConditionVariable(&m_cond);
-    }
-
-    void notify_all() {
-      WakeAllConditionVariable(&m_cond);
-    }
-
-    void wait(std::unique_lock<dxvk::mutex>& lock) {
-      auto srw = lock.mutex()->native_handle();
-      SleepConditionVariableSRW(&m_cond, srw, INFINITE, 0);
-    }
-
-    template<typename Predicate>
-    void wait(std::unique_lock<dxvk::mutex>& lock, Predicate pred) {
-      while (!pred())
-        wait(lock);
-    }
-
-    template<typename Clock, typename Duration>
-    std::cv_status wait_until(std::unique_lock<dxvk::mutex>& lock, const std::chrono::time_point<Clock, Duration>& time) {
-      auto now = Clock::now();
-
-      return (now < time)
-        ? wait_for(lock, now - time)
-        : std::cv_status::timeout;
-    }
-
-    template<typename Clock, typename Duration, typename Predicate>
-    bool wait_until(std::unique_lock<dxvk::mutex>& lock, const std::chrono::time_point<Clock, Duration>& time, Predicate pred) {
-      if (pred())
-        return true;
-
-      auto now = Clock::now();
-      return now < time && wait_for(lock, now - time, pred);
-    }
-
-    template<typename Rep, typename Period>
-    std::cv_status wait_for(std::unique_lock<dxvk::mutex>& lock, const std::chrono::duration<Rep, Period>& timeout) {
-      auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(timeout);
-      auto srw = lock.mutex()->native_handle();
-
-      return SleepConditionVariableSRW(&m_cond, srw, ms.count(), 0)
-        ? std::cv_status::no_timeout
-        : std::cv_status::timeout;
-    }
-
-    template<typename Rep, typename Period, typename Predicate>
-    bool wait_for(std::unique_lock<dxvk::mutex>& lock, const std::chrono::duration<Rep, Period>& timeout, Predicate pred) {
-      bool result = pred();
-
-      if (!result && wait_for(lock, timeout) == std::cv_status::no_timeout)
-        result = pred();
-
-      return result;
-    }
-
-    native_handle_type native_handle() {
-      return &m_cond;
-    }
-
-  private:
-
-    CONDITION_VARIABLE m_cond;
-
-  };
+  using mutex = std::mutex;
+  using recursive_mutex = std::recursive_mutex;
+  using condition_variable = std::condition_variable;
 
 }