From 82552e5b7cbad8942bb80d371e08618a4ebd5531 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 4 Mar 2025 10:22:20 -0800
Subject: [PATCH] Make SDL_RegisterEvents() thread-safe
Fixes https://github.com/libsdl-org/SDL/issues/12457
---
src/events/SDL_events.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c
index 157f0180061ab..349d575015a07 100644
--- a/src/events/SDL_events.c
+++ b/src/events/SDL_events.c
@@ -110,7 +110,7 @@ typedef struct
} SDL_DisabledEventBlock;
static SDL_DisabledEventBlock *SDL_disabled_events[256];
-static Uint32 SDL_userevents = SDL_EVENT_USER;
+static SDL_AtomicInt SDL_userevents;
typedef struct SDL_TemporaryMemory
{
@@ -1893,9 +1893,11 @@ Uint32 SDL_RegisterEvents(int numevents)
{
Uint32 event_base = 0;
- if ((numevents > 0) && (SDL_userevents + numevents <= SDL_EVENT_LAST)) {
- event_base = SDL_userevents;
- SDL_userevents += numevents;
+ if (numevents > 0) {
+ int value = SDL_AddAtomicInt(&SDL_userevents, numevents);
+ if (value >= 0 && value <= (SDL_EVENT_LAST - SDL_EVENT_USER)) {
+ event_base = (Uint32)(SDL_EVENT_USER + value);
+ }
}
return event_base;
}