annotate SDL3/SDL_mutex.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 Simple DirectMedia Layer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 This software is provided 'as-is', without any express or implied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 warranty. In no event will the authors be held liable for any damages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 arising from the use of this software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 Permission is granted to anyone to use this software for any purpose,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 including commercial applications, and to alter it and redistribute it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 freely, subject to the following restrictions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 1. The origin of this software must not be misrepresented; you must not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 claim that you wrote the original software. If you use this software
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 in a product, an acknowledgment in the product documentation would be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 appreciated but is not required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 2. Altered source versions must be plainly marked as such, and must not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 misrepresented as being the original software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 3. This notice may not be removed or altered from any source distribution.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #ifndef SDL_mutex_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 #define SDL_mutex_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 * # CategoryMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 * SDL offers several thread synchronization primitives. This document can't
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 * cover the complicated topic of thread safety, but reading up on what each
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 * of these primitives are, why they are useful, and how to correctly use them
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 * is vital to writing correct and safe multithreaded programs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 * - Mutexes: SDL_CreateMutex()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 * - Read/Write locks: SDL_CreateRWLock()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 * - Semaphores: SDL_CreateSemaphore()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 * - Condition variables: SDL_CreateCondition()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 * SDL also offers a datatype, SDL_InitState, which can be used to make sure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 * only one thread initializes/deinitializes some resource that several
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 * threads might try to use for the first time simultaneously.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #include <SDL3/SDL_stdinc.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 #include <SDL3/SDL_atomic.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 #include <SDL3/SDL_error.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 #include <SDL3/SDL_thread.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #ifdef SDL_WIKI_DOCUMENTATION_SECTION
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 * Enable thread safety attributes, only with clang.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 * The attributes can be safely erased when compiling with other compilers.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 * To enable analysis, set these environment variables before running cmake:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 * ```bash
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 * export CC=clang
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 * export CFLAGS="-DSDL_THREAD_SAFETY_ANALYSIS -Wthread-safety"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 #define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 #elif defined(SDL_THREAD_SAFETY_ANALYSIS) && defined(__clang__) && (!defined(SWIG))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 #define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) /* no-op */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 #define SDL_CAPABILITY(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 SDL_THREAD_ANNOTATION_ATTRIBUTE__(capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #define SDL_SCOPED_CAPABILITY \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 SDL_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 #define SDL_GUARDED_BY(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 SDL_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 #define SDL_PT_GUARDED_BY(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 SDL_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 #define SDL_ACQUIRED_BEFORE(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 #define SDL_ACQUIRED_AFTER(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 #define SDL_REQUIRES(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 #define SDL_REQUIRES_SHARED(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 #define SDL_ACQUIRE(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 #define SDL_ACQUIRE_SHARED(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 #define SDL_RELEASE(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 #define SDL_RELEASE_SHARED(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 #define SDL_RELEASE_GENERIC(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 #define SDL_TRY_ACQUIRE(x, y) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(x, y))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 #define SDL_TRY_ACQUIRE_SHARED(x, y) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(x, y))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 #define SDL_EXCLUDES(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 SDL_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 #define SDL_ASSERT_CAPABILITY(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 #define SDL_ASSERT_SHARED_CAPABILITY(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 #define SDL_RETURN_CAPABILITY(x) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 SDL_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 * Wrapper around Clang thread safety analysis annotations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 * Please see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 * \since This macro is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 #define SDL_NO_THREAD_SAFETY_ANALYSIS \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 SDL_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 /******************************************************************************/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 #include <SDL3/SDL_begin_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 /* Set up for C function definitions, even when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 extern "C" {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 * \name Mutex functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 /* @{ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 * A means to serialize access to a resource between threads.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 * Mutexes (short for "mutual exclusion") are a synchronization primitive that
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 * allows exactly one thread to proceed at a time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 * Wikipedia has a thorough explanation of the concept:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 * https://en.wikipedia.org/wiki/Mutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 typedef struct SDL_Mutex SDL_Mutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 * Create a new mutex.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 * All newly-created mutexes begin in the _unlocked_ state.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 * Calls to SDL_LockMutex() will not return while the mutex is locked by
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 * another thread. See SDL_TryLockMutex() to attempt to lock without blocking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 * SDL mutexes are reentrant.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 * \returns the initialized and unlocked mutex or NULL on failure; call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 * SDL_GetError() for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 * \sa SDL_DestroyMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 * \sa SDL_LockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 * \sa SDL_TryLockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 * \sa SDL_UnlockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 extern SDL_DECLSPEC SDL_Mutex * SDLCALL SDL_CreateMutex(void);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 * Lock the mutex.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 * This will block until the mutex is available, which is to say it is in the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 * unlocked state and the OS has chosen the caller as the next thread to lock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 * it. Of all threads waiting to lock the mutex, only one may do so at a time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 * It is legal for the owning thread to lock an already-locked mutex. It must
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 * unlock it the same number of times before it is actually made available for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 * other threads in the system (this is known as a "recursive mutex").
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 * This function does not fail; if mutex is NULL, it will return immediately
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 * having locked nothing. If the mutex is valid, this function will always
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 * block until it can lock the mutex, and return with it locked.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 * \param mutex the mutex to lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 * \sa SDL_TryLockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 * \sa SDL_UnlockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 extern SDL_DECLSPEC void SDLCALL SDL_LockMutex(SDL_Mutex *mutex) SDL_ACQUIRE(mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 * Try to lock a mutex without blocking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 * This works just like SDL_LockMutex(), but if the mutex is not available,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 * this function returns false immediately.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 * This technique is useful if you need exclusive access to a resource but
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 * don't want to wait for it, and will return to it to try again later.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 * This function returns true if passed a NULL mutex.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 * \param mutex the mutex to try to lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 * \returns true on success, false if the mutex would block.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 * \sa SDL_LockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 * \sa SDL_UnlockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 extern SDL_DECLSPEC bool SDLCALL SDL_TryLockMutex(SDL_Mutex *mutex) SDL_TRY_ACQUIRE(true, mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 * Unlock the mutex.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 * It is legal for the owning thread to lock an already-locked mutex. It must
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 * unlock it the same number of times before it is actually made available for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 * other threads in the system (this is known as a "recursive mutex").
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 * It is illegal to unlock a mutex that has not been locked by the current
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 * thread, and doing so results in undefined behavior.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 * \param mutex the mutex to unlock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 * \sa SDL_LockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 * \sa SDL_TryLockMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 extern SDL_DECLSPEC void SDLCALL SDL_UnlockMutex(SDL_Mutex *mutex) SDL_RELEASE(mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 * Destroy a mutex created with SDL_CreateMutex().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 * This function must be called on any mutex that is no longer needed. Failure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 * to destroy a mutex will result in a system memory or resource leak. While
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 * it is safe to destroy a mutex that is _unlocked_, it is not safe to attempt
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 * to destroy a locked mutex, and may result in undefined behavior depending
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 * on the platform.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 * \param mutex the mutex to destroy.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 * \sa SDL_CreateMutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 extern SDL_DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_Mutex *mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 /* @} *//* Mutex functions */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 * \name Read/write lock functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 /* @{ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 * A mutex that allows read-only threads to run in parallel.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 * A rwlock is roughly the same concept as SDL_Mutex, but allows threads that
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 * request read-only access to all hold the lock at the same time. If a thread
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 * requests write access, it will block until all read-only threads have
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 * released the lock, and no one else can hold the thread (for reading or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 * writing) at the same time as the writing thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 * This can be more efficient in cases where several threads need to access
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 * data frequently, but changes to that data are rare.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 * There are other rules that apply to rwlocks that don't apply to mutexes,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 * about how threads are scheduled and when they can be recursively locked.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 * These are documented in the other rwlock functions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 typedef struct SDL_RWLock SDL_RWLock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 * Create a new read/write lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 * A read/write lock is useful for situations where you have multiple threads
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 * trying to access a resource that is rarely updated. All threads requesting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 * a read-only lock will be allowed to run in parallel; if a thread requests a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 * write lock, it will be provided exclusive access. This makes it safe for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 * multiple threads to use a resource at the same time if they promise not to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 * change it, and when it has to be changed, the rwlock will serve as a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 * gateway to make sure those changes can be made safely.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 * In the right situation, a rwlock can be more efficient than a mutex, which
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 * only lets a single thread proceed at a time, even if it won't be modifying
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 * the data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 * All newly-created read/write locks begin in the _unlocked_ state.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 * Calls to SDL_LockRWLockForReading() and SDL_LockRWLockForWriting will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 * return while the rwlock is locked _for writing_ by another thread. See
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 * SDL_TryLockRWLockForReading() and SDL_TryLockRWLockForWriting() to attempt
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 * to lock without blocking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 * SDL read/write locks are only recursive for read-only locks! They are not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 * guaranteed to be fair, or provide access in a FIFO manner! They are not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 * guaranteed to favor writers. You may not lock a rwlock for both read-only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 * and write access at the same time from the same thread (so you can't
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 * promote your read-only lock to a write lock without unlocking first).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 * \returns the initialized and unlocked read/write lock or NULL on failure;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 * call SDL_GetError() for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 * \sa SDL_DestroyRWLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 * \sa SDL_LockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 * \sa SDL_LockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 * \sa SDL_TryLockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 * \sa SDL_TryLockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 * \sa SDL_UnlockRWLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 extern SDL_DECLSPEC SDL_RWLock * SDLCALL SDL_CreateRWLock(void);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 * Lock the read/write lock for _read only_ operations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 * This will block until the rwlock is available, which is to say it is not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 * locked for writing by any other thread. Of all threads waiting to lock the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 * rwlock, all may do so at the same time as long as they are requesting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 * read-only access; if a thread wants to lock for writing, only one may do so
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 * at a time, and no other threads, read-only or not, may hold the lock at the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 * same time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 * It is legal for the owning thread to lock an already-locked rwlock for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 * reading. It must unlock it the same number of times before it is actually
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 * made available for other threads in the system (this is known as a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 * "recursive rwlock").
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 * Note that locking for writing is not recursive (this is only available to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 * read-only locks).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 * It is illegal to request a read-only lock from a thread that already holds
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 * the write lock. Doing so results in undefined behavior. Unlock the write
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 * lock before requesting a read-only lock. (But, of course, if you have the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 * write lock, you don't need further locks to read in any case.)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 * This function does not fail; if rwlock is NULL, it will return immediately
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 * having locked nothing. If the rwlock is valid, this function will always
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 * block until it can lock the mutex, and return with it locked.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 * \param rwlock the read/write lock to lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 * \sa SDL_LockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 * \sa SDL_TryLockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 * \sa SDL_UnlockRWLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForReading(SDL_RWLock *rwlock) SDL_ACQUIRE_SHARED(rwlock);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 * Lock the read/write lock for _write_ operations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 * This will block until the rwlock is available, which is to say it is not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 * locked for reading or writing by any other thread. Only one thread may hold
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 * the lock when it requests write access; all other threads, whether they
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 * also want to write or only want read-only access, must wait until the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 * writer thread has released the lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 * It is illegal for the owning thread to lock an already-locked rwlock for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 * writing (read-only may be locked recursively, writing can not). Doing so
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 * results in undefined behavior.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 * It is illegal to request a write lock from a thread that already holds a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 * read-only lock. Doing so results in undefined behavior. Unlock the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 * read-only lock before requesting a write lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 * This function does not fail; if rwlock is NULL, it will return immediately
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 * having locked nothing. If the rwlock is valid, this function will always
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 * block until it can lock the mutex, and return with it locked.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 * \param rwlock the read/write lock to lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 * \sa SDL_LockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 * \sa SDL_TryLockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 * \sa SDL_UnlockRWLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 extern SDL_DECLSPEC void SDLCALL SDL_LockRWLockForWriting(SDL_RWLock *rwlock) SDL_ACQUIRE(rwlock);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 * Try to lock a read/write lock _for reading_ without blocking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 * This works just like SDL_LockRWLockForReading(), but if the rwlock is not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 * available, then this function returns false immediately.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 * This technique is useful if you need access to a resource but don't want to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 * wait for it, and will return to it to try again later.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 * Trying to lock for read-only access can succeed if other threads are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 * holding read-only locks, as this won't prevent access.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 * This function returns true if passed a NULL rwlock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 * \param rwlock the rwlock to try to lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 * \returns true on success, false if the lock would block.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 * \sa SDL_LockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 * \sa SDL_TryLockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 * \sa SDL_UnlockRWLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForReading(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE_SHARED(true, rwlock);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 * Try to lock a read/write lock _for writing_ without blocking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 * This works just like SDL_LockRWLockForWriting(), but if the rwlock is not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 * available, then this function returns false immediately.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 * This technique is useful if you need exclusive access to a resource but
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 * don't want to wait for it, and will return to it to try again later.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 * It is illegal for the owning thread to lock an already-locked rwlock for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 * writing (read-only may be locked recursively, writing can not). Doing so
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 * results in undefined behavior.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 * It is illegal to request a write lock from a thread that already holds a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 * read-only lock. Doing so results in undefined behavior. Unlock the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 * read-only lock before requesting a write lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 * This function returns true if passed a NULL rwlock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 * \param rwlock the rwlock to try to lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 * \returns true on success, false if the lock would block.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 * \sa SDL_LockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 * \sa SDL_TryLockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 * \sa SDL_UnlockRWLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 extern SDL_DECLSPEC bool SDLCALL SDL_TryLockRWLockForWriting(SDL_RWLock *rwlock) SDL_TRY_ACQUIRE(true, rwlock);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 * Unlock the read/write lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 * Use this function to unlock the rwlock, whether it was locked for read-only
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 * or write operations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 * It is legal for the owning thread to lock an already-locked read-only lock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 * It must unlock it the same number of times before it is actually made
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 * available for other threads in the system (this is known as a "recursive
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 * rwlock").
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 * It is illegal to unlock a rwlock that has not been locked by the current
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 * thread, and doing so results in undefined behavior.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 * \param rwlock the rwlock to unlock.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 * \sa SDL_LockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 * \sa SDL_LockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 * \sa SDL_TryLockRWLockForReading
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 * \sa SDL_TryLockRWLockForWriting
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 extern SDL_DECLSPEC void SDLCALL SDL_UnlockRWLock(SDL_RWLock *rwlock) SDL_RELEASE_GENERIC(rwlock);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 * Destroy a read/write lock created with SDL_CreateRWLock().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 * This function must be called on any read/write lock that is no longer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 * needed. Failure to destroy a rwlock will result in a system memory or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 * resource leak. While it is safe to destroy a rwlock that is _unlocked_, it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 * is not safe to attempt to destroy a locked rwlock, and may result in
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 * undefined behavior depending on the platform.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 * \param rwlock the rwlock to destroy.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 * \sa SDL_CreateRWLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 extern SDL_DECLSPEC void SDLCALL SDL_DestroyRWLock(SDL_RWLock *rwlock);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 /* @} *//* Read/write lock functions */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 * \name Semaphore functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 /* @{ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 * A means to manage access to a resource, by count, between threads.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 * Semaphores (specifically, "counting semaphores"), let X number of threads
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 * request access at the same time, each thread granted access decrementing a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 * counter. When the counter reaches zero, future requests block until a prior
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 * thread releases their request, incrementing the counter again.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 * Wikipedia has a thorough explanation of the concept:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 * https://en.wikipedia.org/wiki/Semaphore_(programming)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 typedef struct SDL_Semaphore SDL_Semaphore;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 * Create a semaphore.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 * This function creates a new semaphore and initializes it with the value
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 * `initial_value`. Each wait operation on the semaphore will atomically
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 * decrement the semaphore value and potentially block if the semaphore value
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 * is 0. Each post operation will atomically increment the semaphore value and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 * wake waiting threads and allow them to retry the wait operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 * \param initial_value the starting value of the semaphore.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 * \returns a new semaphore or NULL on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 * information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 * \sa SDL_DestroySemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 * \sa SDL_SignalSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 * \sa SDL_TryWaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 * \sa SDL_GetSemaphoreValue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 * \sa SDL_WaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 * \sa SDL_WaitSemaphoreTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 extern SDL_DECLSPEC SDL_Semaphore * SDLCALL SDL_CreateSemaphore(Uint32 initial_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 * Destroy a semaphore.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 * It is not safe to destroy a semaphore if there are threads currently
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 * waiting on it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 * \param sem the semaphore to destroy.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 * \sa SDL_CreateSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 extern SDL_DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_Semaphore *sem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 * Wait until a semaphore has a positive value and then decrements it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 * This function suspends the calling thread until the semaphore pointed to by
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 * `sem` has a positive value, and then atomically decrement the semaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 * value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 * This function is the equivalent of calling SDL_WaitSemaphoreTimeout() with
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 * a time length of -1.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 * \param sem the semaphore wait on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 * \sa SDL_SignalSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 * \sa SDL_TryWaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 * \sa SDL_WaitSemaphoreTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 extern SDL_DECLSPEC void SDLCALL SDL_WaitSemaphore(SDL_Semaphore *sem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 * See if a semaphore has a positive value and decrement it if it does.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 * This function checks to see if the semaphore pointed to by `sem` has a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 * positive value and atomically decrements the semaphore value if it does. If
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 * the semaphore doesn't have a positive value, the function immediately
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 * returns false.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 * \param sem the semaphore to wait on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 * \returns true if the wait succeeds, false if the wait would block.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 * \sa SDL_SignalSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 * \sa SDL_WaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 * \sa SDL_WaitSemaphoreTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 extern SDL_DECLSPEC bool SDLCALL SDL_TryWaitSemaphore(SDL_Semaphore *sem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 * Wait until a semaphore has a positive value and then decrements it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 * This function suspends the calling thread until either the semaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 * pointed to by `sem` has a positive value or the specified time has elapsed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 * If the call is successful it will atomically decrement the semaphore value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 * \param sem the semaphore to wait on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 * \param timeoutMS the length of the timeout, in milliseconds, or -1 to wait
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 * indefinitely.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 * \returns true if the wait succeeds or false if the wait times out.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 * \sa SDL_SignalSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 * \sa SDL_TryWaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 * \sa SDL_WaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 extern SDL_DECLSPEC bool SDLCALL SDL_WaitSemaphoreTimeout(SDL_Semaphore *sem, Sint32 timeoutMS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 * Atomically increment a semaphore's value and wake waiting threads.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 * \param sem the semaphore to increment.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 * \sa SDL_TryWaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 * \sa SDL_WaitSemaphore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 * \sa SDL_WaitSemaphoreTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 extern SDL_DECLSPEC void SDLCALL SDL_SignalSemaphore(SDL_Semaphore *sem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 * Get the current value of a semaphore.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 * \param sem the semaphore to query.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 * \returns the current value of the semaphore.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetSemaphoreValue(SDL_Semaphore *sem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 /* @} *//* Semaphore functions */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 * \name Condition variable functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 /* @{ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 * A means to block multiple threads until a condition is satisfied.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 * Condition variables, paired with an SDL_Mutex, let an app halt multiple
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 * threads until a condition has occurred, at which time the app can release
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 * one or all waiting threads.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 * Wikipedia has a thorough explanation of the concept:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 * https://en.wikipedia.org/wiki/Condition_variable
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 typedef struct SDL_Condition SDL_Condition;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 * Create a condition variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 * \returns a new condition variable or NULL on failure; call SDL_GetError()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 * for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 * \sa SDL_BroadcastCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 * \sa SDL_SignalCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 * \sa SDL_WaitCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 * \sa SDL_WaitConditionTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 * \sa SDL_DestroyCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 extern SDL_DECLSPEC SDL_Condition * SDLCALL SDL_CreateCondition(void);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 * Destroy a condition variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 * \param cond the condition variable to destroy.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 * \sa SDL_CreateCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 extern SDL_DECLSPEC void SDLCALL SDL_DestroyCondition(SDL_Condition *cond);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 * Restart one of the threads that are waiting on the condition variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 * \param cond the condition variable to signal.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 * \sa SDL_BroadcastCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 * \sa SDL_WaitCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 * \sa SDL_WaitConditionTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 extern SDL_DECLSPEC void SDLCALL SDL_SignalCondition(SDL_Condition *cond);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 * Restart all threads that are waiting on the condition variable.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 * \param cond the condition variable to signal.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 * \sa SDL_SignalCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 * \sa SDL_WaitCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 * \sa SDL_WaitConditionTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 extern SDL_DECLSPEC void SDLCALL SDL_BroadcastCondition(SDL_Condition *cond);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 * Wait until a condition variable is signaled.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 * This function unlocks the specified `mutex` and waits for another thread to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 * call SDL_SignalCondition() or SDL_BroadcastCondition() on the condition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 * variable `cond`. Once the condition variable is signaled, the mutex is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 * re-locked and the function returns.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 * The mutex must be locked before calling this function. Locking the mutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 * recursively (more than once) is not supported and leads to undefined
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 * behavior.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 * This function is the equivalent of calling SDL_WaitConditionTimeout() with
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 * a time length of -1.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 * \param cond the condition variable to wait on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 * \param mutex the mutex used to coordinate thread access.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 * \sa SDL_BroadcastCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 * \sa SDL_SignalCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 * \sa SDL_WaitConditionTimeout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 extern SDL_DECLSPEC void SDLCALL SDL_WaitCondition(SDL_Condition *cond, SDL_Mutex *mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 * Wait until a condition variable is signaled or a certain time has passed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 * This function unlocks the specified `mutex` and waits for another thread to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 * call SDL_SignalCondition() or SDL_BroadcastCondition() on the condition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 * variable `cond`, or for the specified time to elapse. Once the condition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 * variable is signaled or the time elapsed, the mutex is re-locked and the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 * function returns.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 * The mutex must be locked before calling this function. Locking the mutex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898 * recursively (more than once) is not supported and leads to undefined
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 * behavior.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 * \param cond the condition variable to wait on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 * \param mutex the mutex used to coordinate thread access.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 * \param timeoutMS the maximum time to wait, in milliseconds, or -1 to wait
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 * indefinitely.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 * \returns true if the condition variable is signaled, false if the condition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 * is not signaled in the allotted time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 * \sa SDL_BroadcastCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 * \sa SDL_SignalCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 * \sa SDL_WaitCondition
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 extern SDL_DECLSPEC bool SDLCALL SDL_WaitConditionTimeout(SDL_Condition *cond,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 SDL_Mutex *mutex, Sint32 timeoutMS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 /* @} *//* Condition variable functions */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 * \name Thread-safe initialization state functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 /* @{ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 * The current status of an SDL_InitState structure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 * \since This enum is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 typedef enum SDL_InitStatus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 SDL_INIT_STATUS_UNINITIALIZED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 SDL_INIT_STATUS_INITIALIZING,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935 SDL_INIT_STATUS_INITIALIZED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 SDL_INIT_STATUS_UNINITIALIZING
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 } SDL_InitStatus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 * A structure used for thread-safe initialization and shutdown.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 * Here is an example of using this:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 * static SDL_InitState init;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947 * bool InitSystem(void)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 * {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 * if (!SDL_ShouldInit(&init)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 * // The system is initialized
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 * return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 * // At this point, you should not leave this function without calling SDL_SetInitialized()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 * bool initialized = DoInitTasks();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 * SDL_SetInitialized(&init, initialized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 * return initialized;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 * bool UseSubsystem(void)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 * {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 * if (SDL_ShouldInit(&init)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 * // Error, the subsystem isn't initialized
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 * SDL_SetInitialized(&init, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 * return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 * // Do work using the initialized subsystem
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 * return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 * void QuitSystem(void)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 * {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 * if (!SDL_ShouldQuit(&init)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 * // The system is not initialized
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 * return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 * // At this point, you should not leave this function without calling SDL_SetInitialized()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 * DoQuitTasks();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 * SDL_SetInitialized(&init, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 * Note that this doesn't protect any resources created during initialization,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 * or guarantee that nobody is using those resources during cleanup. You
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 * should use other mechanisms to protect those, if that's a concern for your
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 * code.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 typedef struct SDL_InitState
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 SDL_AtomicInt status;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 SDL_ThreadID thread;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 void *reserved;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 } SDL_InitState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 * Return whether initialization should be done.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 * This function checks the passed in state and if initialization should be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 * done, sets the status to `SDL_INIT_STATUS_INITIALIZING` and returns true.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 * If another thread is already modifying this state, it will wait until
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 * that's done before returning.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1010 * If this function returns true, the calling code must call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 * SDL_SetInitialized() to complete the initialization.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 * \param state the initialization state to check.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 * \returns true if initialization needs to be done, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 * \sa SDL_SetInitialized
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 * \sa SDL_ShouldQuit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 extern SDL_DECLSPEC bool SDLCALL SDL_ShouldInit(SDL_InitState *state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 * Return whether cleanup should be done.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 * This function checks the passed in state and if cleanup should be done,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 * sets the status to `SDL_INIT_STATUS_UNINITIALIZING` and returns true.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 * If this function returns true, the calling code must call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 * SDL_SetInitialized() to complete the cleanup.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 * \param state the initialization state to check.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 * \returns true if cleanup needs to be done, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 * \sa SDL_SetInitialized
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 * \sa SDL_ShouldInit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 extern SDL_DECLSPEC bool SDLCALL SDL_ShouldQuit(SDL_InitState *state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 * Finish an initialization state transition.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 * This function sets the status of the passed in state to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 * `SDL_INIT_STATUS_INITIALIZED` or `SDL_INIT_STATUS_UNINITIALIZED` and allows
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 * any threads waiting for the status to proceed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 * \param state the initialization state to check.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 * \param initialized the new initialization state.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 * \sa SDL_ShouldInit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 * \sa SDL_ShouldQuit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 extern SDL_DECLSPEC void SDLCALL SDL_SetInitialized(SDL_InitState *state, bool initialized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 /* @} *//* Thread-safe initialization state functions */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067 /* Ends C function definitions when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 #include <SDL3/SDL_close_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 #endif /* SDL_mutex_h_ */