annotate SDL3/SDL_asyncio.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 /* WIKI CATEGORY: AsyncIO */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
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 * # CategoryAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 * SDL offers a way to perform I/O asynchronously. This allows an app to read
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 * or write files without waiting for data to actually transfer; the functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 * that request I/O never block while the request is fulfilled.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 * Instead, the data moves in the background and the app can check for results
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 * at their leisure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 * This is more complicated than just reading and writing files in a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 * synchronous way, but it can allow for more efficiency, and never having
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 * framerate drops as the hard drive catches up, etc.
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 * The general usage pattern for async I/O is:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 * - Create one or more SDL_AsyncIOQueue objects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 * - Open files with SDL_AsyncIOFromFile.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 * - Start I/O tasks to the files with SDL_ReadAsyncIO or SDL_WriteAsyncIO,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 * putting those tasks into one of the queues.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 * - Later on, use SDL_GetAsyncIOResult on a queue to see if any task is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 * finished without blocking. Tasks might finish in any order with success
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 * or failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 * - When all your tasks are done, close the file with SDL_CloseAsyncIO. This
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 * also generates a task, since it might flush data to disk!
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 * This all works, without blocking, in a single thread, but one can also wait
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 * on a queue in a background thread, sleeping until new results have arrived:
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 * - Call SDL_WaitAsyncIOResult from one or more threads to efficiently block
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 * until new tasks complete.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 * - When shutting down, call SDL_SignalAsyncIOQueue to unblock any sleeping
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 * threads despite there being no new tasks completed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 * And, of course, to match the synchronous SDL_LoadFile, we offer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 * SDL_LoadFileAsync as a convenience function. This will handle allocating a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 * buffer, slurping in the file data, and null-terminating it; you still check
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 * for results later.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 * Behind the scenes, SDL will use newer, efficient APIs on platforms that
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 * support them: Linux's io_uring and Windows 11's IoRing, for example. If
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 * those technologies aren't available, SDL will offload the work to a thread
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 * pool that will manage otherwise-synchronous loads without blocking the app.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 * ## Best Practices
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 * Simple non-blocking I/O--for an app that just wants to pick up data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 * whenever it's ready without losing framerate waiting on disks to spin--can
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 * use whatever pattern works well for the program. In this case, simply call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 * SDL_ReadAsyncIO, or maybe SDL_LoadFileAsync, as needed. Once a frame, call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 * SDL_GetAsyncIOResult to check for any completed tasks and deal with the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 * data as it arrives.
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 * If two separate pieces of the same program need their own I/O, it is legal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 * for each to create their own queue. This will prevent either piece from
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 * accidentally consuming the other's completed tasks. Each queue does require
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 * some amount of resources, but it is not an overwhelming cost. Do not make a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 * queue for each task, however. It is better to put many tasks into a single
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 * queue. They will be reported in order of completion, not in the order they
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 * were submitted, so it doesn't generally matter what order tasks are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 * started.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 * One async I/O queue can be shared by multiple threads, or one thread can
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 * have more than one queue, but the most efficient way--if ruthless
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 * efficiency is the goal--is to have one queue per thread, with multiple
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 * threads working in parallel, and attempt to keep each queue loaded with
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 * tasks that are both started by and consumed by the same thread. On modern
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 * platforms that can use newer interfaces, this can keep data flowing as
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 * efficiently as possible all the way from storage hardware to the app, with
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 * no contention between threads for access to the same queue.
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 * Written data is not guaranteed to make it to physical media by the time a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 * closing task is completed, unless SDL_CloseAsyncIO is called with its
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 * `flush` parameter set to true, which is to say that a successful result
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 * here can still result in lost data during an unfortunately-timed power
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 * outage if not flushed. However, flushing will take longer and may be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 * unnecessary, depending on the app's needs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 */
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 #ifndef SDL_asyncio_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 #define SDL_asyncio_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 #include <SDL3/SDL_stdinc.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 #include <SDL3/SDL_begin_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 /* Set up for C function definitions, even when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 extern "C" {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
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 * The asynchronous I/O operation structure.
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 * This operates as an opaque handle. One can then request read or write
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 * operations on it.
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 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 * \sa SDL_AsyncIOFromFile
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 typedef struct SDL_AsyncIO SDL_AsyncIO;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
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 * Types of asynchronous I/O tasks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 * \since This enum is available since SDL 3.2.0.
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 typedef enum SDL_AsyncIOTaskType
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 SDL_ASYNCIO_TASK_READ, /**< A read operation. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 SDL_ASYNCIO_TASK_WRITE, /**< A write operation. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 SDL_ASYNCIO_TASK_CLOSE /**< A close operation. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 } SDL_AsyncIOTaskType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 * Possible outcomes of an asynchronous I/O task.
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 * \since This enum is available since SDL 3.2.0.
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 typedef enum SDL_AsyncIOResult
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 SDL_ASYNCIO_COMPLETE, /**< request was completed without error */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 SDL_ASYNCIO_FAILURE, /**< request failed for some reason; check SDL_GetError()! */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 SDL_ASYNCIO_CANCELED /**< request was canceled before completing. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 } SDL_AsyncIOResult;
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 * Information about a completed asynchronous I/O request.
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 * \since This struct is available since SDL 3.2.0.
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 typedef struct SDL_AsyncIOOutcome
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 SDL_AsyncIO *asyncio; /**< what generated this task. This pointer will be invalid if it was closed! */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 SDL_AsyncIOTaskType type; /**< What sort of task was this? Read, write, etc? */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 SDL_AsyncIOResult result; /**< the result of the work (success, failure, cancellation). */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 void *buffer; /**< buffer where data was read/written. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 Uint64 offset; /**< offset in the SDL_AsyncIO where data was read/written. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 Uint64 bytes_requested; /**< number of bytes the task was to read/write. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 Uint64 bytes_transferred; /**< actual number of bytes that were read/written. */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 void *userdata; /**< pointer provided by the app when starting the task */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 } SDL_AsyncIOOutcome;
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 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 * A queue of completed asynchronous I/O tasks.
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 * When starting an asynchronous operation, you specify a queue for the new
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 * task. A queue can be asked later if any tasks in it have completed,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 * allowing an app to manage multiple pending tasks in one place, in whatever
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 * order they complete.
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 struct 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 * \sa SDL_CreateAsyncIOQueue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 * \sa SDL_ReadAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 * \sa SDL_WriteAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 * \sa SDL_GetAsyncIOResult
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 * \sa SDL_WaitAsyncIOResult
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 typedef struct SDL_AsyncIOQueue SDL_AsyncIOQueue;
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 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 * Use this function to create a new SDL_AsyncIO object for reading from
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 * and/or writing to a named file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 * The `mode` string understands the following values:
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 * - "r": Open a file for reading only. It must exist.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 * - "w": Open a file for writing only. It will create missing files or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 * truncate existing ones.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 * - "r+": Open a file for update both reading and writing. The file must
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 * exist.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 * - "w+": Create an empty file for both reading and writing. If a file with
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 * the same name already exists its content is erased and the file is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 * treated as a new empty file.
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 * There is no "b" mode, as there is only "binary" style I/O, and no "a" mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 * for appending, since you specify the position when starting a task.
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 * This function supports Unicode filenames, but they must be encoded in UTF-8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 * format, regardless of the underlying operating system.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 * This call is _not_ asynchronous; it will open the file before returning,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 * under the assumption that doing so is generally a fast operation. Future
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 * reads and writes to the opened file will be async, however.
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 * \param file a UTF-8 string representing the filename to open.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 * \param mode an ASCII string representing the mode to be used for opening
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 * the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 * \returns a pointer to the SDL_AsyncIO structure that is created or NULL on
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 * failure; call SDL_GetError() for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 * \sa SDL_CloseAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 * \sa SDL_ReadAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 * \sa SDL_WriteAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 extern SDL_DECLSPEC SDL_AsyncIO * SDLCALL SDL_AsyncIOFromFile(const char *file, const char *mode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
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 * Use this function to get the size of the data stream in an SDL_AsyncIO.
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 * This call is _not_ asynchronous; it assumes that obtaining this info is a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 * non-blocking operation in most reasonable cases.
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 * \param asyncio the SDL_AsyncIO to get the size of the data stream from.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 * \returns the size of the data stream in the SDL_IOStream on success or a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 * negative error code on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 * information.
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 * \threadsafety It is safe to call this function from any thread.
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 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetAsyncIOSize(SDL_AsyncIO *asyncio);
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 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 * Start an async read.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 * This function reads up to `size` bytes from `offset` position in the data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 * source to the area pointed at by `ptr`. This function may read less bytes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 * than requested.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 * This function returns as quickly as possible; it does not wait for the read
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 * to complete. On a successful return, this work will continue in the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 * background. If the work begins, even failure is asynchronous: a failing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 * return value from this function only means the work couldn't start at all.
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 * `ptr` must remain available until the work is done, and may be accessed by
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 * the system at any time until then. Do not allocate it on the stack, as this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 * might take longer than the life of the calling function to complete!
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 * An SDL_AsyncIOQueue must be specified. The newly-created task will be added
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 * to it when it completes its work.
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 * \param asyncio a pointer to an SDL_AsyncIO structure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 * \param ptr a pointer to a buffer to read data into.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 * \param offset the position to start reading in the data source.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 * \param size the number of bytes to read from the data source.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 * \param queue a queue to add the new SDL_AsyncIO to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 * \param userdata an app-defined pointer that will be provided with the task
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 * results.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 * \returns true on success or false on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 * information.
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 * \threadsafety It is safe to call this function from any thread.
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 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 * \sa SDL_WriteAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 * \sa SDL_CreateAsyncIOQueue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 extern SDL_DECLSPEC bool SDLCALL SDL_ReadAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata);
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 * Start an async write.
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 * This function writes `size` bytes from `offset` position in the data source
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 * to the area pointed at by `ptr`.
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 * This function returns as quickly as possible; it does not wait for the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 * write to complete. On a successful return, this work will continue in the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 * background. If the work begins, even failure is asynchronous: a failing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 * return value from this function only means the work couldn't start at all.
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 * `ptr` must remain available until the work is done, and may be accessed by
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 * the system at any time until then. Do not allocate it on the stack, as this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 * might take longer than the life of the calling function to complete!
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 * An SDL_AsyncIOQueue must be specified. The newly-created task will be added
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 * to it when it completes its work.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 * \param asyncio a pointer to an SDL_AsyncIO structure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 * \param ptr a pointer to a buffer to write data from.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 * \param offset the position to start writing to the data source.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 * \param size the number of bytes to write to the data source.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 * \param queue a queue to add the new SDL_AsyncIO to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 * \param userdata an app-defined pointer that will be provided with the task
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 * results.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 * \returns true on success or false on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 * information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 * \since This function is available since SDL 3.2.0.
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 * \sa SDL_ReadAsyncIO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 * \sa SDL_CreateAsyncIOQueue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 extern SDL_DECLSPEC bool SDLCALL SDL_WriteAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 * Close and free any allocated resources for an async I/O object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 * Closing a file is _also_ an asynchronous task! If a write failure were to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 * happen during the closing process, for example, the task results will
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 * report it as usual.
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 * Closing a file that has been written to does not guarantee the data has
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 * made it to physical media; it may remain in the operating system's file
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 * cache, for later writing to disk. This means that a successfully-closed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 * file can be lost if the system crashes or loses power in this small window.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 * To prevent this, call this function with the `flush` parameter set to true.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 * This will make the operation take longer, and perhaps increase system load
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 * in general, but a successful result guarantees that the data has made it to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 * physical storage. Don't use this for temporary files, caches, and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 * unimportant data, and definitely use it for crucial irreplaceable files,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 * like game saves.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 * This function guarantees that the close will happen after any other pending
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 * tasks to `asyncio`, so it's safe to open a file, start several operations,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 * close the file immediately, then check for all results later. This function
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 * will not block until the tasks have completed.
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 * Once this function returns true, `asyncio` is no longer valid, regardless
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 * of any future outcomes. Any completed tasks might still contain this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 * pointer in their SDL_AsyncIOOutcome data, in case the app was using this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 * value to track information, but it should not be used again.
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 * If this function returns false, the close wasn't started at all, and it's
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 * safe to attempt to close again later.
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 * An SDL_AsyncIOQueue must be specified. The newly-created task will be added
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 * to it when it completes its work.
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 * \param asyncio a pointer to an SDL_AsyncIO structure to close.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 * \param flush true if data should sync to disk before the task completes.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 * \param queue a queue to add the new SDL_AsyncIO to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 * \param userdata an app-defined pointer that will be provided with the task
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 * results.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 * \returns true on success or false on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 * information.
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 * \threadsafety It is safe to call this function from any thread, but two
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 * threads should not attempt to close the same object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 * \since This function is available since SDL 3.2.0.
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_CloseAsyncIO(SDL_AsyncIO *asyncio, bool flush, SDL_AsyncIOQueue *queue, void *userdata);
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 * Create a task queue for tracking multiple I/O operations.
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 * Async I/O operations are assigned to a queue when started. The queue can be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 * checked for completed tasks thereafter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 * \returns a new task queue object or NULL if there was an error; call
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 * SDL_GetError() for more information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 * \sa SDL_DestroyAsyncIOQueue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 * \sa SDL_GetAsyncIOResult
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 * \sa SDL_WaitAsyncIOResult
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 SDL_AsyncIOQueue * SDLCALL SDL_CreateAsyncIOQueue(void);
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 previously-created async I/O task queue.
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 * If there are still tasks pending for this queue, this call will block until
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 * those tasks are finished. All those tasks will be deallocated. Their
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 * results will be lost to the app.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 * Any pending reads from SDL_LoadFileAsync() that are still in this queue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 * will have their buffers deallocated by this function, to prevent a memory
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 * leak.
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 * Once this function is called, the queue is no longer valid and should not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 * be used, including by other threads that might access it while destruction
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 * is blocking on pending tasks.
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 * Do not destroy a queue that still has threads waiting on it through
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 * SDL_WaitAsyncIOResult(). You can call SDL_SignalAsyncIOQueue() first to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 * unblock those threads, and take measures (such as SDL_WaitThread()) to make
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 * sure they have finished their wait and won't wait on the queue again.
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 * \param queue the task queue to destroy.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 * \threadsafety It is safe to call this function from any thread, so long as
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 * no other thread is waiting on the queue with
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 * SDL_WaitAsyncIOResult.
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 * \since This function is available since SDL 3.2.0.
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 extern SDL_DECLSPEC void SDLCALL SDL_DestroyAsyncIOQueue(SDL_AsyncIOQueue *queue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 * Query an async I/O task queue for completed tasks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 * If a task assigned to this queue has finished, this will return true and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 * fill in `outcome` with the details of the task. If no task in the queue has
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 * finished, this function will return false. This function does not block.
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 * If a task has completed, this function will free its resources and the task
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 * pointer will no longer be valid. The task will be removed from the queue.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 * It is safe for multiple threads to call this function on the same queue at
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 * once; a completed task will only go to one of the threads.
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 * \param queue the async I/O task queue to query.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 * \param outcome details of a finished task will be written here. May not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 * NULL.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 * \returns true if a task has completed, false otherwise.
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 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 * \sa SDL_WaitAsyncIOResult
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 extern SDL_DECLSPEC bool SDLCALL SDL_GetAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome);
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 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 * Block until an async I/O task queue has a completed task.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 * This function puts the calling thread to sleep until there a task assigned
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 * to the queue that has finished.
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 * If a task assigned to the queue has finished, this will return true and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 * fill in `outcome` with the details of the task. If no task in the queue has
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 * finished, this function will return false.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 * If a task has completed, this function will free its resources and the task
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 * pointer will no longer be valid. The task will be removed from the queue.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 * It is safe for multiple threads to call this function on the same queue at
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 * once; a completed task will only go to one of the threads.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 * Note that by the nature of various platforms, more than one waiting thread
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 * may wake to handle a single task, but only one will obtain it, so
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 * `timeoutMS` is a _maximum_ wait time, and this function may return false
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 * sooner.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 * This function may return false if there was a system error, the OS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 * inadvertently awoke multiple threads, or if SDL_SignalAsyncIOQueue() was
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 * called to wake up all waiting threads without a finished task.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 * A timeout can be used to specify a maximum wait time, but rather than
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 * polling, it is possible to have a timeout of -1 to wait forever, and use
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 * SDL_SignalAsyncIOQueue() to wake up the waiting threads later.
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 * \param queue the async I/O task queue to wait on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 * \param outcome details of a finished task will be written here. May not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 * NULL.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 * \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
473 * indefinitely.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 * \returns true if task has completed, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 * \sa SDL_SignalAsyncIOQueue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 extern SDL_DECLSPEC bool SDLCALL SDL_WaitAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome, Sint32 timeoutMS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 * Wake up any threads that are blocking in SDL_WaitAsyncIOResult().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 * This will unblock any threads that are sleeping in a call to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 * SDL_WaitAsyncIOResult for the specified queue, and cause them to return
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 * from that function.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 * This can be useful when destroying a queue to make sure nothing is touching
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 * it indefinitely. In this case, once this call completes, the caller should
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 * take measures to make sure any previously-blocked threads have returned
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 * from their wait and will not touch the queue again (perhaps by setting a
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 * flag to tell the threads to terminate and then using SDL_WaitThread() to
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 * make sure they've done so).
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 queue the async I/O task queue to signal.
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 * \threadsafety It is safe to call this function from any thread.
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 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 * \sa SDL_WaitAsyncIOResult
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_SignalAsyncIOQueue(SDL_AsyncIOQueue *queue);
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 * Load all the data from a file path, asynchronously.
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 function returns as quickly as possible; it does not wait for the read
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 * to complete. On a successful return, this work will continue in the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 * background. If the work begins, even failure is asynchronous: a failing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 * return value from this function only means the work couldn't start at all.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 * The data is allocated with a zero byte at the end (null terminated) for
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 * convenience. This extra byte is not included in SDL_AsyncIOOutcome's
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 * bytes_transferred value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 * This function will allocate the buffer to contain the file. It must be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 * deallocated by calling SDL_free() on SDL_AsyncIOOutcome's buffer field
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 * after completion.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 * An SDL_AsyncIOQueue must be specified. The newly-created task will be added
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 * to it when it completes its work.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 * \param file the path to read all available data from.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 * \param queue a queue to add the new SDL_AsyncIO to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 * \param userdata an app-defined pointer that will be provided with the task
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 * results.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 * \returns true on success or false on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 * information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 * \sa SDL_LoadFile_IO
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 extern SDL_DECLSPEC bool SDLCALL SDL_LoadFileAsync(const char *file, SDL_AsyncIOQueue *queue, void *userdata);
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 /* Ends C function definitions when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 #include <SDL3/SDL_close_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 #endif /* SDL_asyncio_h_ */