From ca4f5dd40d2a8551d57f4a71df071e615ab931ec Mon Sep 17 00:00:00 2001
From: Moritz <[EMAIL REDACTED]>
Date: Wed, 25 Dec 2024 18:46:59 +0100
Subject: [PATCH] Added SDL_GetThreadState
---
include/SDL3/SDL_thread.h | 31 +++++++++++++++++++++++++++++++
src/dynapi/SDL_dynapi.sym | 1 +
src/dynapi/SDL_dynapi_overrides.h | 1 +
src/dynapi/SDL_dynapi_procs.h | 1 +
src/thread/SDL_thread.c | 5 +++++
src/thread/SDL_thread_c.h | 8 --------
6 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/include/SDL3/SDL_thread.h b/include/SDL3/SDL_thread.h
index 0eb481587f2d8..3e37c3180daf2 100644
--- a/include/SDL3/SDL_thread.h
+++ b/include/SDL3/SDL_thread.h
@@ -102,6 +102,25 @@ typedef enum SDL_ThreadPriority {
SDL_THREAD_PRIORITY_TIME_CRITICAL
} SDL_ThreadPriority;
+/**
+ * The SDL thread state.
+ *
+ * SDL stores the current state of a thread in an atomic int.
+ * The current state of a thread can be checked by calling
+ * SDL_GetThreadState.
+ *
+ * \since This enum is available since SDL 3.1.3.
+ *
+ * \sa SDL_GetThreadState
+ */
+typedef enum SDL_ThreadState
+{
+ SDL_THREAD_STATE_ALIVE,
+ SDL_THREAD_STATE_DETACHED,
+ SDL_THREAD_STATE_ZOMBIE,
+ SDL_THREAD_STATE_CLEANED,
+} SDL_ThreadState;
+
/**
* The function passed to SDL_CreateThread() as the new thread's entry point.
*
@@ -422,6 +441,18 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetCurrentThreadPriority(SDL_ThreadPriority
*/
extern SDL_DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status);
+/**
+ * Get the current state of a thread.
+ *
+ * \param thread the thread whose status you want to check.
+ * \returns the current state of a thread as defined in the SDL_ThreadState enum.
+ *
+ * \since This function is available since SDL 3.1.3.
+ *
+ * \sa SDL_ThreadState
+ */
+extern SDL_DECLSPEC SDL_ThreadState SDLCALL SDL_GetThreadState(SDL_Thread *thread);
+
/**
* Let a thread clean up on exit without intervention.
*
diff --git a/src/dynapi/SDL_dynapi.sym b/src/dynapi/SDL_dynapi.sym
index 37a018e75f998..47ddb603d4150 100644
--- a/src/dynapi/SDL_dynapi.sym
+++ b/src/dynapi/SDL_dynapi.sym
@@ -1229,6 +1229,7 @@ SDL3_0.0.0 {
SDL_GetTrayEntryParent;
SDL_GetTrayMenuParentEntry;
SDL_GetTrayMenuParentTray;
+ SDL_GetThreadState;
# extra symbols go here (don't modify this line)
local: *;
};
diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h
index 9fa340a26b9b8..cf47d1c93caa4 100644
--- a/src/dynapi/SDL_dynapi_overrides.h
+++ b/src/dynapi/SDL_dynapi_overrides.h
@@ -1254,3 +1254,4 @@
#define SDL_GetTrayEntryParent SDL_GetTrayEntryParent_REAL
#define SDL_GetTrayMenuParentEntry SDL_GetTrayMenuParentEntry_REAL
#define SDL_GetTrayMenuParentTray SDL_GetTrayMenuParentTray_REAL
+#define SDL_GetThreadState SDL_GetThreadState_REAL
diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h
index eec6229fff699..01f6a4de1df2d 100644
--- a/src/dynapi/SDL_dynapi_procs.h
+++ b/src/dynapi/SDL_dynapi_procs.h
@@ -1262,3 +1262,4 @@ SDL_DYNAPI_PROC(void,SDL_DestroyTray,(SDL_Tray *a),(a),)
SDL_DYNAPI_PROC(SDL_TrayMenu*,SDL_GetTrayEntryParent,(SDL_TrayEntry *a),(a),return)
SDL_DYNAPI_PROC(SDL_TrayEntry*,SDL_GetTrayMenuParentEntry,(SDL_TrayMenu *a),(a),return)
SDL_DYNAPI_PROC(SDL_Tray*,SDL_GetTrayMenuParentTray,(SDL_TrayMenu *a),(a),return)
+SDL_DYNAPI_PROC(SDL_ThreadState,SDL_GetThreadState,(SDL_Thread *a),(a),return)
diff --git a/src/thread/SDL_thread.c b/src/thread/SDL_thread.c
index e69462cb90a06..fcb11019c14fc 100644
--- a/src/thread/SDL_thread.c
+++ b/src/thread/SDL_thread.c
@@ -456,6 +456,11 @@ void SDL_WaitThread(SDL_Thread *thread, int *status)
}
}
+SDL_ThreadState SDL_GetThreadState(SDL_Thread *thread)
+{
+ return (SDL_ThreadState)SDL_GetAtomicInt(&thread->state);
+}
+
void SDL_DetachThread(SDL_Thread *thread)
{
if (!thread) {
diff --git a/src/thread/SDL_thread_c.h b/src/thread/SDL_thread_c.h
index c703e526212c8..f8b3fb8953f5e 100644
--- a/src/thread/SDL_thread_c.h
+++ b/src/thread/SDL_thread_c.h
@@ -44,14 +44,6 @@
#endif
#include "../SDL_error_c.h"
-typedef enum SDL_ThreadState
-{
- SDL_THREAD_STATE_ALIVE,
- SDL_THREAD_STATE_DETACHED,
- SDL_THREAD_STATE_ZOMBIE,
- SDL_THREAD_STATE_CLEANED,
-} SDL_ThreadState;
-
// This is the system-independent thread info structure
struct SDL_Thread
{