SDL3pp
A slim C++ wrapper for SDL3
Loading...
Searching...
No Matches
SDL3pp_thread.h
1#ifndef SDL3PP_THREAD_H_
2#define SDL3PP_THREAD_H_
3
4#include <SDL3/SDL_thread.h>
5#include "SDL3pp_atomic.h"
6#include "SDL3pp_properties.h"
7#include "SDL3pp_stdinc.h"
8
9namespace SDL {
10
32// Forward decl
33struct Thread;
34
36using ThreadRaw = SDL_Thread*;
37
38// Forward decl
39struct ThreadRef;
40
43{
45
48 : value(value)
49 {
50 }
51
53 constexpr ThreadParam(std::nullptr_t = nullptr)
54 : value(nullptr)
55 {
56 }
57
59 constexpr explicit operator bool() const { return !!value; }
60
62 constexpr auto operator<=>(const ThreadParam& other) const = default;
63
65 constexpr operator ThreadRaw() const { return value; }
66};
67
79using ThreadPriority = SDL_ThreadPriority;
80
81constexpr ThreadPriority THREAD_PRIORITY_LOW = SDL_THREAD_PRIORITY_LOW;
82
84 SDL_THREAD_PRIORITY_NORMAL;
85
87 SDL_THREAD_PRIORITY_HIGH;
88
90 SDL_THREAD_PRIORITY_TIME_CRITICAL;
91
101using ThreadState = SDL_ThreadState;
102
104 SDL_THREAD_UNKNOWN;
105
107 SDL_THREAD_ALIVE;
108
110 SDL_THREAD_DETACHED;
111
113constexpr ThreadState THREAD_COMPLETE = SDL_THREAD_COMPLETE;
114
127using ThreadID = SDL_ThreadID;
128
137using ThreadFunction = int(SDLCALL*)(void* data);
138
148using ThreadCB = std::function<int()>;
149
161using TLSDestructorCallback = void(SDLCALL*)(void* value);
162
176{
177 ThreadRaw m_resource = nullptr;
178
179public:
181 constexpr Thread(std::nullptr_t = nullptr) noexcept
182 : m_resource(0)
183 {
184 }
185
193 constexpr explicit Thread(const ThreadRaw resource) noexcept
194 : m_resource(resource)
195 {
196 }
197
198protected:
200 constexpr Thread(const Thread& other) noexcept = default;
201
202public:
204 constexpr Thread(Thread&& other) noexcept
205 : Thread(other.release())
206 {
207 }
208
209 constexpr Thread(const ThreadRef& other) = delete;
210
211 constexpr Thread(ThreadRef&& other) = delete;
212
215
246 Thread(ThreadFunction fn, StringParam name, void* data)
247 : m_resource(CheckError(SDL_CreateThread(fn, name, data)))
248 {
249 }
250
314 : m_resource(CheckError(SDL_CreateThreadWithProperties(props)))
315 {
316 }
317
319 ~Thread() { SDL_DetachThread(m_resource); }
320
322 constexpr Thread& operator=(Thread&& other) noexcept
323 {
324 std::swap(m_resource, other.m_resource);
325 return *this;
326 }
327
328protected:
330 constexpr Thread& operator=(const Thread& other) noexcept = default;
331
332public:
334 constexpr ThreadRaw get() const noexcept { return m_resource; }
335
337 constexpr ThreadRaw release() noexcept
338 {
339 auto r = m_resource;
340 m_resource = nullptr;
341 return r;
342 }
343
345 constexpr auto operator<=>(const Thread& other) const noexcept = default;
346
348 constexpr explicit operator bool() const noexcept { return !!m_resource; }
349
351 constexpr operator ThreadParam() const noexcept { return {m_resource}; }
352
384 void Detach();
385
394 const char* GetName() const;
395
410 ThreadID GetID() const;
411
424 static void SetCurrentPriority(ThreadPriority priority);
425
457 void Wait(int* status);
458
469 ThreadState GetState() const;
470};
471
474{
475 using Thread::Thread;
476
484 ThreadRef(ThreadParam resource) noexcept
485 : Thread(resource.value)
486 {
487 }
488
496 ThreadRef(ThreadRaw resource) noexcept
497 : Thread(resource)
498 {
499 }
500
502 constexpr ThreadRef(const ThreadRef& other) noexcept = default;
503
506};
507
520
551inline Thread CreateThread(ThreadFunction fn, StringParam name, void* data)
552{
553 return Thread(fn, std::move(name), data);
554}
555
619{
620 return Thread(props);
621}
622
623namespace prop::thread {
624
625constexpr auto CREATE_ENTRY_FUNCTION_POINTER =
626 SDL_PROP_THREAD_CREATE_ENTRY_FUNCTION_POINTER;
627
628constexpr auto CREATE_NAME_STRING = SDL_PROP_THREAD_CREATE_NAME_STRING;
629
630constexpr auto CREATE_USERDATA_POINTER =
631 SDL_PROP_THREAD_CREATE_USERDATA_POINTER;
632
633constexpr auto CREATE_STACKSIZE_NUMBER =
634 SDL_PROP_THREAD_CREATE_STACKSIZE_NUMBER;
635
636} // namespace prop::thread
637
647inline const char* GetThreadName(ThreadParam thread)
648{
649 return SDL_GetThreadName(thread);
650}
651
652inline const char* Thread::GetName() const
653{
654 return SDL::GetThreadName(m_resource);
655}
656
673inline ThreadID GetCurrentThreadID() { return SDL_GetCurrentThreadID(); }
674
691{
692 return SDL_GetThreadID(thread);
693}
694
695inline ThreadID Thread::GetID() const { return SDL::GetThreadID(m_resource); }
696
710{
711 CheckError(SDL_SetCurrentThreadPriority(priority));
712}
713
715{
717}
718
751inline void WaitThread(ThreadParam thread, int* status)
752{
753 SDL_WaitThread(thread, status);
754}
755
756inline void Thread::Wait(int* status) { SDL::WaitThread(m_resource, status); }
757
770{
771 return SDL_GetThreadState(thread);
772}
773
775{
776 return SDL::GetThreadState(m_resource);
777}
778
812inline void DetachThread(ThreadRaw thread) { SDL_DetachThread(thread); }
813
815
829inline void* GetTLS(TLSID* id) { return SDL_GetTLS(id); }
830
856inline void SetTLS(TLSID* id,
857 const void* value,
858 TLSDestructorCallback destructor)
859{
860 CheckError(SDL_SetTLS(id, value, destructor));
861}
862
874inline void CleanupTLS() { SDL_CleanupTLS(); }
875
877
878} // namespace SDL
879
880#endif /* SDL3PP_THREAD_H_ */
Helpers to use C++ strings parameters.
Definition: SDL3pp_strings.h:43
The SDL thread object.
Definition: SDL3pp_thread.h:176
Thread(ThreadCB fn, StringParam name)
Default ctor.
Definition: SDL3pp_thread.h:214
constexpr auto operator<=>(const Thread &other) const noexcept=default
Comparison.
constexpr Thread(const ThreadRaw resource) noexcept
Constructs from ThreadParam.
Definition: SDL3pp_thread.h:193
constexpr Thread(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_thread.h:181
constexpr Thread & operator=(Thread &&other) noexcept
Assignment operator.
Definition: SDL3pp_thread.h:322
constexpr ThreadRaw release() noexcept
Retrieves underlying ThreadRaw and clear this.
Definition: SDL3pp_thread.h:337
Thread(ThreadFunction fn, StringParam name, void *data)
Create a new thread with a default stack size.
Definition: SDL3pp_thread.h:246
~Thread()
Destructor.
Definition: SDL3pp_thread.h:319
Thread(PropertiesParam props)
Create a new thread with with the specified properties.
Definition: SDL3pp_thread.h:313
constexpr Thread(Thread &&other) noexcept
Move constructor.
Definition: SDL3pp_thread.h:204
constexpr ThreadRaw get() const noexcept
Retrieves underlying ThreadRaw.
Definition: SDL3pp_thread.h:334
constexpr Thread(const Thread &other) noexcept=default
Copy constructor.
constexpr Thread & operator=(const Thread &other) noexcept=default
Assignment operator.
constexpr void CheckError(bool result)
Check and throw if returned value from SDL is an error.
Definition: SDL3pp_error.h:197
constexpr ThreadPriority THREAD_PRIORITY_HIGH
HIGH.
Definition: SDL3pp_thread.h:86
ThreadState GetThreadState(ThreadParam thread)
Get the current state of a thread.
Definition: SDL3pp_thread.h:769
void CleanupTLS()
Cleanup all TLS data for this thread.
Definition: SDL3pp_thread.h:874
constexpr ThreadPriority THREAD_PRIORITY_TIME_CRITICAL
TIME_CRITICAL.
Definition: SDL3pp_thread.h:89
constexpr ThreadState THREAD_DETACHED
The thread is detached and can't be waited on.
Definition: SDL3pp_thread.h:109
const char * GetName() const
Get the thread name as it was specified in Thread.Thread().
Definition: SDL3pp_thread.h:652
int(SDLCALL *)(void *data) ThreadFunction
The function passed to Thread.Thread() as the new thread's entry point.
Definition: SDL3pp_thread.h:137
void(SDLCALL *)(void *value) TLSDestructorCallback
The callback used to cleanup data passed to SetTLS.
Definition: SDL3pp_thread.h:161
Thread CreateThreadWithProperties(PropertiesParam props)
Create a new thread with with the specified properties.
Definition: SDL3pp_thread.h:618
void DetachThread(ThreadRaw thread)
Let a thread clean up on exit without intervention.
Definition: SDL3pp_thread.h:812
constexpr ThreadState THREAD_ALIVE
The thread is currently running.
Definition: SDL3pp_thread.h:106
constexpr ThreadPriority THREAD_PRIORITY_LOW
LOW.
Definition: SDL3pp_thread.h:81
void SetCurrentThreadPriority(ThreadPriority priority)
Set the priority for the current thread.
Definition: SDL3pp_thread.h:709
ThreadID GetThreadID(ThreadParam thread)
Get the thread identifier for the specified thread.
Definition: SDL3pp_thread.h:690
SDL_ThreadState ThreadState
The SDL thread state.
Definition: SDL3pp_thread.h:101
const char * GetThreadName(ThreadParam thread)
Get the thread name as it was specified in Thread.Thread().
Definition: SDL3pp_thread.h:647
std::function< int()> ThreadCB
The function passed to Thread.Thread() as the new thread's entry point.
Definition: SDL3pp_thread.h:148
ThreadID GetCurrentThreadID()
Get the thread identifier for the current thread.
Definition: SDL3pp_thread.h:673
constexpr ThreadState THREAD_UNKNOWN
The thread is not valid.
Definition: SDL3pp_thread.h:103
SDL_ThreadPriority ThreadPriority
The SDL thread priority.
Definition: SDL3pp_thread.h:79
void Detach()
Let a thread clean up on exit without intervention.
Definition: SDL3pp_thread.h:814
static void SetCurrentPriority(ThreadPriority priority)
Set the priority for the current thread.
Definition: SDL3pp_thread.h:714
SDL_ThreadID ThreadID
A unique numeric ID that identifies a thread.
Definition: SDL3pp_thread.h:127
void Wait(int *status)
Wait for a thread to finish.
Definition: SDL3pp_thread.h:756
Thread CreateThread(ThreadFunction fn, StringParam name, void *data)
Create a new thread with a default stack size.
Definition: SDL3pp_thread.h:551
ThreadID GetID() const
Get the thread identifier for the specified thread.
Definition: SDL3pp_thread.h:695
SDL_Thread * ThreadRaw
Alias to raw representation for Thread.
Definition: SDL3pp_thread.h:36
void SetTLS(TLSID *id, const void *value, TLSDestructorCallback destructor)
Set the current thread's value associated with a thread local storage ID.
Definition: SDL3pp_thread.h:856
constexpr ThreadPriority THREAD_PRIORITY_NORMAL
NORMAL.
Definition: SDL3pp_thread.h:83
ThreadState GetState() const
Get the current state of a thread.
Definition: SDL3pp_thread.h:774
constexpr ThreadState THREAD_COMPLETE
The thread has finished and should be cleaned up with Thread.Wait()
Definition: SDL3pp_thread.h:113
void * GetTLS(TLSID *id)
Get the current thread's value associated with a thread local storage ID.
Definition: SDL3pp_thread.h:829
void WaitThread(ThreadParam thread, int *status)
Wait for a thread to finish.
Definition: SDL3pp_thread.h:751
Main include header for the SDL3pp library.
A type representing an atomic integer value.
Definition: SDL3pp_atomic.h:218
Safely wrap Properties for non owning parameters.
Definition: SDL3pp_properties.h:53
Safely wrap Thread for non owning parameters.
Definition: SDL3pp_thread.h:43
constexpr auto operator<=>(const ThreadParam &other) const =default
Comparison.
ThreadRaw value
parameter's ThreadRaw
Definition: SDL3pp_thread.h:44
constexpr ThreadParam(ThreadRaw value)
Constructs from ThreadRaw.
Definition: SDL3pp_thread.h:47
constexpr ThreadParam(std::nullptr_t=nullptr)
Constructs null/invalid.
Definition: SDL3pp_thread.h:53
Semi-safe reference for Thread.
Definition: SDL3pp_thread.h:474
~ThreadRef()
Destructor.
Definition: SDL3pp_thread.h:505
ThreadRef(ThreadRaw resource) noexcept
Constructs from ThreadParam.
Definition: SDL3pp_thread.h:496
constexpr ThreadRef(const ThreadRef &other) noexcept=default
Copy constructor.
ThreadRef(ThreadParam resource) noexcept
Constructs from ThreadParam.
Definition: SDL3pp_thread.h:484