From 38afd48daf368c77118681b6155f49aeb88822a1 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 23 Oct 2023 09:46:09 -0700
Subject: [PATCH] Added a single source of SDL object IDs
This ensures that we don't accidentally interpret an ID from one system as an ID in another system.
Audio device IDs are not covered here, since they have a unique numbering system.
---
src/SDL.c | 14 ++++++++++++++
src/SDL_internal.h | 1 +
src/joystick/SDL_joystick.c | 10 ----------
src/joystick/SDL_joystick_c.h | 3 ---
src/joystick/android/SDL_sysjoystick.c | 2 +-
src/joystick/apple/SDL_mfijoystick.m | 2 +-
src/joystick/bsd/SDL_bsdjoystick.c | 2 +-
src/joystick/darwin/SDL_iokitjoystick.c | 2 +-
src/joystick/hidapi/SDL_hidapijoystick.c | 2 +-
src/joystick/linux/SDL_sysjoystick.c | 4 ++--
src/joystick/virtual/SDL_virtualjoystick.c | 2 +-
src/joystick/windows/SDL_rawinputjoystick.c | 2 +-
src/joystick/windows/SDL_windows_gaming_input.c | 2 +-
src/joystick/windows/SDL_windowsjoystick.c | 2 +-
src/sensor/SDL_sensor.c | 10 ----------
src/sensor/SDL_sensor_c.h | 3 ---
src/sensor/android/SDL_androidsensor.c | 2 +-
src/sensor/coremotion/SDL_coremotionsensor.m | 4 ++--
src/sensor/n3ds/SDL_n3dssensor.c | 4 ++--
src/sensor/vita/SDL_vitasensor.c | 4 ++--
src/sensor/windows/SDL_windowssensor.c | 2 +-
src/video/SDL_sysvideo.h | 1 -
src/video/SDL_video.c | 7 +++----
23 files changed, 37 insertions(+), 50 deletions(-)
diff --git a/src/SDL.c b/src/SDL.c
index cfd096cdc1e5..235233ce1ed1 100644
--- a/src/SDL.c
+++ b/src/SDL.c
@@ -514,6 +514,20 @@ void SDL_Quit(void)
SDL_bInMainQuit = SDL_FALSE;
}
+/* Assume we can wrap SDL_AtomicInt values and cast to Uint32 */
+SDL_COMPILE_TIME_ASSERT(sizeof_object_id, sizeof(int) == sizeof(Uint32));
+
+Uint32 SDL_GetNextObjectID(void)
+{
+ static SDL_AtomicInt last_id;
+
+ Uint32 id = (Uint32)SDL_AtomicIncRef(&last_id) + 1;
+ if (id == 0) {
+ id = (Uint32)SDL_AtomicIncRef(&last_id) + 1;
+ }
+ return id;
+}
+
/* Get the library version number */
int SDL_GetVersion(SDL_version *ver)
{
diff --git a/src/SDL_internal.h b/src/SDL_internal.h
index 3e2148c3df10..aa2d6c6271f1 100644
--- a/src/SDL_internal.h
+++ b/src/SDL_internal.h
@@ -197,6 +197,7 @@
extern "C" {
#endif
+extern DECLSPEC Uint32 SDLCALL SDL_GetNextObjectID(void);
extern DECLSPEC int SDLCALL SDL_WaitSemaphoreTimeoutNS(SDL_Semaphore *sem, Sint64 timeoutNS);
extern DECLSPEC int SDLCALL SDL_WaitConditionTimeoutNS(SDL_Condition *cond, SDL_Mutex *mutex, Sint64 timeoutNS);
extern DECLSPEC int SDLCALL SDL_WaitEventTimeoutNS(SDL_Event *event, Sint64 timeoutNS);
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 335243ced089..bf5b1f4f56a3 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -116,7 +116,6 @@ static SDL_bool SDL_joysticks_initialized;
static SDL_bool SDL_joysticks_quitting;
static SDL_bool SDL_joystick_being_added;
static SDL_Joystick *SDL_joysticks SDL_GUARDED_BY(SDL_joystick_lock) = NULL;
-static SDL_AtomicInt SDL_last_joystick_instance_id;
static int SDL_joystick_player_count SDL_GUARDED_BY(SDL_joystick_lock) = 0;
static SDL_JoystickID *SDL_joystick_players SDL_GUARDED_BY(SDL_joystick_lock) = NULL;
static SDL_bool SDL_joystick_allows_background_events = SDL_FALSE;
@@ -413,15 +412,6 @@ SDL_JoystickID *SDL_GetJoysticks(int *count)
return joysticks;
}
-/*
- * Return the next available joystick instance ID
- * This may be called by drivers from multiple threads, unprotected by any locks
- */
-SDL_JoystickID SDL_GetNextJoystickInstanceID(void)
-{
- return SDL_AtomicIncRef(&SDL_last_joystick_instance_id) + 1;
-}
-
/*
* Get the implementation dependent name of a joystick
*/
diff --git a/src/joystick/SDL_joystick_c.h b/src/joystick/SDL_joystick_c.h
index 685fbebe3186..d81896e28e6b 100644
--- a/src/joystick/SDL_joystick_c.h
+++ b/src/joystick/SDL_joystick_c.h
@@ -53,9 +53,6 @@ extern void SDL_AssertJoysticksLocked(void) SDL_ASSERT_CAPABILITY(SDL_joystick_l
/* Function to return whether there are any joysticks opened by the application */
extern SDL_bool SDL_JoysticksOpened(void);
-/* Function to get the next available joystick instance ID */
-extern SDL_JoystickID SDL_GetNextJoystickInstanceID(void);
-
/* Function to standardize the name for a controller
This should be freed with SDL_free() when no longer needed
*/
diff --git a/src/joystick/android/SDL_sysjoystick.c b/src/joystick/android/SDL_sysjoystick.c
index d8acacc36c09..0b635ba5c266 100644
--- a/src/joystick/android/SDL_sysjoystick.c
+++ b/src/joystick/android/SDL_sysjoystick.c
@@ -378,7 +378,7 @@ int Android_AddJoystick(int device_id, const char *name, const char *desc, int v
}
item->naxes = naxes;
item->nhats = nhats;
- item->device_instance = SDL_GetNextJoystickInstanceID();
+ item->device_instance = SDL_GetNextObjectID();
if (SDL_joylist_tail == NULL) {
SDL_joylist = SDL_joylist_tail = item;
} else {
diff --git a/src/joystick/apple/SDL_mfijoystick.m b/src/joystick/apple/SDL_mfijoystick.m
index 32f6f7ca848e..b2daeac60982 100644
--- a/src/joystick/apple/SDL_mfijoystick.m
+++ b/src/joystick/apple/SDL_mfijoystick.m
@@ -561,7 +561,7 @@ static void IOS_AddJoystickDevice(GCController *controller, SDL_bool acceleromet
}
device->accelerometer = accelerometer;
- device->instance_id = SDL_GetNextJoystickInstanceID();
+ device->instance_id = SDL_GetNextObjectID();
if (accelerometer) {
#ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
diff --git a/src/joystick/bsd/SDL_bsdjoystick.c b/src/joystick/bsd/SDL_bsdjoystick.c
index 30ca7965fc14..176e5eebd6ad 100644
--- a/src/joystick/bsd/SDL_bsdjoystick.c
+++ b/src/joystick/bsd/SDL_bsdjoystick.c
@@ -466,7 +466,7 @@ static int MaybeAddDevice(const char *path)
return -1;
}
- item->device_instance = SDL_GetNextJoystickInstanceID();
+ item->device_instance = SDL_GetNextObjectID();
if (SDL_joylist_tail == NULL) {
SDL_joylist = SDL_joylist_tail = item;
} else {
diff --git a/src/joystick/darwin/SDL_iokitjoystick.c b/src/joystick/darwin/SDL_iokitjoystick.c
index 7bbc4bd9e13a..92650b7d48f6 100644
--- a/src/joystick/darwin/SDL_iokitjoystick.c
+++ b/src/joystick/darwin/SDL_iokitjoystick.c
@@ -549,7 +549,7 @@ static void JoystickDeviceWasAddedCallback(void *ctx, IOReturn res, void *sender
device->runLoopAttached = SDL_TRUE;
/* Allocate an instance ID for this device */
- device->instance_id = SDL_GetNextJoystickInstanceID();
+ device->instance_id = SDL_GetNextObjectID();
/* We have to do some storage of the io_service_t for SDL_HapticOpenFromJoystick */
ioservice = IOHIDDeviceGetService(ioHIDDeviceObject);
diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c
index 7fa7da96a7dd..7ee6abd5f8f5 100644
--- a/src/joystick/hidapi/SDL_hidapijoystick.c
+++ b/src/joystick/hidapi/SDL_hidapijoystick.c
@@ -790,7 +790,7 @@ SDL_bool HIDAPI_JoystickConnected(SDL_HIDAPI_Device *device, SDL_JoystickID *pJo
}
}
- joystickID = SDL_GetNextJoystickInstanceID();
+ joystickID = SDL_GetNextObjectID();
HIDAPI_AddJoystickInstanceToDevice(device, joystickID);
for (i = 0; i < device->num_children; ++i) {
diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c
index fea20069544f..7d9a62ff0689 100644
--- a/src/joystick/linux/SDL_sysjoystick.c
+++ b/src/joystick/linux/SDL_sysjoystick.c
@@ -443,7 +443,7 @@ static int MaybeAddDevice(const char *path)
return -1;
}
- item->device_instance = SDL_GetNextJoystickInstanceID();
+ item->device_instance = SDL_GetNextObjectID();
if (SDL_joylist_tail == NULL) {
SDL_joylist = SDL_joylist_tail = item;
} else {
@@ -615,7 +615,7 @@ static SDL_bool SteamControllerConnectedCallback(const char *name, SDL_JoystickG
return SDL_FALSE;
}
- *device_instance = item->device_instance = SDL_GetNextJoystickInstanceID();
+ *device_instance = item->device_instance = SDL_GetNextObjectID();
if (SDL_joylist_tail == NULL) {
SDL_joylist = SDL_joylist_tail = item;
} else {
diff --git a/src/joystick/virtual/SDL_virtualjoystick.c b/src/joystick/virtual/SDL_virtualjoystick.c
index b22ae6acc44c..29ec65f98b0d 100644
--- a/src/joystick/virtual/SDL_virtualjoystick.c
+++ b/src/joystick/virtual/SDL_virtualjoystick.c
@@ -237,7 +237,7 @@ SDL_JoystickID SDL_JoystickAttachVirtualInner(const SDL_VirtualJoystickDesc *des
}
/* Allocate an instance ID for this device */
- hwdata->instance_id = SDL_GetNextJoystickInstanceID();
+ hwdata->instance_id = SDL_GetNextObjectID();
/* Add virtual joystick to SDL-global lists */
if (g_VJoys) {
diff --git a/src/joystick/windows/SDL_rawinputjoystick.c b/src/joystick/windows/SDL_rawinputjoystick.c
index fd2e84249ce4..468dd92acea3 100644
--- a/src/joystick/windows/SDL_rawinputjoystick.c
+++ b/src/joystick/windows/SDL_rawinputjoystick.c
@@ -920,7 +920,7 @@ static void RAWINPUT_AddDevice(HANDLE hDevice)
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
- device->joystick_id = SDL_GetNextJoystickInstanceID();
+ device->joystick_id = SDL_GetNextObjectID();
#ifdef DEBUG_RAWINPUT
SDL_Log("Adding RAWINPUT device '%s' VID 0x%.4x, PID 0x%.4x, version %d, handle 0x%.8x\n", device->name, device->vendor_id, device->product_id, device->version, device->hDevice);
diff --git a/src/joystick/windows/SDL_windows_gaming_input.c b/src/joystick/windows/SDL_windows_gaming_input.c
index 68c5e3714012..675e21537cd5 100644
--- a/src/joystick/windows/SDL_windows_gaming_input.c
+++ b/src/joystick/windows/SDL_windows_gaming_input.c
@@ -489,7 +489,7 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeAdde
WindowsGamingInputControllerState *controllers = SDL_realloc(wgi.controllers, sizeof(wgi.controllers[0]) * (wgi.controller_count + 1));
if (controllers) {
WindowsGamingInputControllerState *state = &controllers[wgi.controller_count];
- SDL_JoystickID joystickID = SDL_GetNextJoystickInstanceID();
+ SDL_JoystickID joystickID = SDL_GetNextObjectID();
SDL_zerop(state);
state->instance_id = joystickID;
diff --git a/src/joystick/windows/SDL_windowsjoystick.c b/src/joystick/windows/SDL_windowsjoystick.c
index cfb8908a4624..173ac431edb4 100644
--- a/src/joystick/windows/SDL_windowsjoystick.c
+++ b/src/joystick/windows/SDL_windowsjoystick.c
@@ -453,7 +453,7 @@ static void SDL_StopJoystickThread(void)
void WINDOWS_AddJoystickDevice(JoyStick_DeviceData *device)
{
device->send_add_event = SDL_TRUE;
- device->nInstanceID = SDL_GetNextJoystickInstanceID();
+ device->nInstanceID = SDL_GetNextObjectID();
device->pNext = SYS_Joystick;
SYS_Joystick = device;
}
diff --git a/src/sensor/SDL_sensor.c b/src/sensor/SDL_sensor.c
index 85a828895efd..9bc262858e49 100644
--- a/src/sensor/SDL_sensor.c
+++ b/src/sensor/SDL_sensor.c
@@ -58,7 +58,6 @@ static SDL_AtomicInt SDL_sensor_lock_pending;
static int SDL_sensors_locked;
static SDL_bool SDL_sensors_initialized;
static SDL_Sensor *SDL_sensors SDL_GUARDED_BY(SDL_sensor_lock) = NULL;
-static SDL_AtomicInt SDL_last_sensor_instance_id;
static char SDL_sensor_magic;
#define CHECK_SENSOR_MAGIC(sensor, retval) \
@@ -218,15 +217,6 @@ SDL_SensorID *SDL_GetSensors(int *count)
return sensors;
}
-/*
- * Return the next available sensor instance ID
- * This may be called by drivers from multiple threads, unprotected by any locks
- */
-SDL_SensorID SDL_GetNextSensorInstanceID(void)
-{
- return SDL_AtomicIncRef(&SDL_last_sensor_instance_id) + 1;
-}
-
/*
* Get the driver and device index for a sensor instance ID
* This should be called while the sensor lock is held, to prevent another thread from updating the list
diff --git a/src/sensor/SDL_sensor_c.h b/src/sensor/SDL_sensor_c.h
index ece9ec50df72..689a10892001 100644
--- a/src/sensor/SDL_sensor_c.h
+++ b/src/sensor/SDL_sensor_c.h
@@ -31,9 +31,6 @@ struct SDL_SensorDriver;
/* Useful functions and variables from SDL_sensor.c */
-/* Function to get the next available sensor instance ID */
-extern SDL_SensorID SDL_GetNextSensorInstanceID(void);
-
/* Initialization and shutdown functions */
extern int SDL_InitSensors(void);
extern void SDL_QuitSensors(void);
diff --git a/src/sensor/android/SDL_androidsensor.c b/src/sensor/android/SDL_androidsensor.c
index 856f64b3db82..f2556b7369b4 100644
--- a/src/sensor/android/SDL_androidsensor.c
+++ b/src/sensor/android/SDL_androidsensor.c
@@ -152,7 +152,7 @@ static int SDL_ANDROID_SensorInit(void)
for (i = 0; i < sensors_count; ++i) {
SDL_sensors[i].asensor = sensors[i];
- SDL_sensors[i].instance_id = SDL_GetNextSensorInstanceID();
+ SDL_sensors[i].instance_id = SDL_GetNextObjectID();
}
SDL_sensors_count = sensors_count;
}
diff --git a/src/sensor/coremotion/SDL_coremotionsensor.m b/src/sensor/coremotion/SDL_coremotionsensor.m
index 6afe47c8fcf2..87021ca20759 100644
--- a/src/sensor/coremotion/SDL_coremotionsensor.m
+++ b/src/sensor/coremotion/SDL_coremotionsensor.m
@@ -63,12 +63,12 @@ static int SDL_COREMOTION_SensorInit(void)
i = 0;
if (SDL_motion_manager.accelerometerAvailable) {
SDL_sensors[i].type = SDL_SENSOR_ACCEL;
- SDL_sensors[i].instance_id = SDL_GetNextSensorInstanceID();
+ SDL_sensors[i].instance_id = SDL_GetNextObjectID();
++i;
}
if (SDL_motion_manager.gyroAvailable) {
SDL_sensors[i].type = SDL_SENSOR_GYRO;
- SDL_sensors[i].instance_id = SDL_GetNextSensorInstanceID();
+ SDL_sensors[i].instance_id = SDL_GetNextObjectID();
++i;
}
SDL_sensors_count = sensors_count;
diff --git a/src/sensor/n3ds/SDL_n3dssensor.c b/src/sensor/n3ds/SDL_n3dssensor.c
index 21ccb4417569..0e75c8e66880 100644
--- a/src/sensor/n3ds/SDL_n3dssensor.c
+++ b/src/sensor/n3ds/SDL_n3dssensor.c
@@ -54,9 +54,9 @@ static int N3DS_SensorInit(void)
}
N3DS_sensors[0].type = SDL_SENSOR_ACCEL;
- N3DS_sensors[0].instance_id = SDL_GetNextSensorInstanceID();
+ N3DS_sensors[0].instance_id = SDL_GetNextObjectID();
N3DS_sensors[1].type = SDL_SENSOR_GYRO;
- N3DS_sensors[1].instance_id = SDL_GetNextSensorInstanceID();
+ N3DS_sensors[1].instance_id = SDL_GetNextObjectID();
return 0;
}
diff --git a/src/sensor/vita/SDL_vitasensor.c b/src/sensor/vita/SDL_vitasensor.c
index 1f203103c419..50838a46ff5e 100644
--- a/src/sensor/vita/SDL_vitasensor.c
+++ b/src/sensor/vita/SDL_vitasensor.c
@@ -56,9 +56,9 @@ static int SDL_VITA_SensorInit(void)
}
SDL_sensors[0].type = SDL_SENSOR_ACCEL;
- SDL_sensors[0].instance_id = SDL_GetNextSensorInstanceID();
+ SDL_sensors[0].instance_id = SDL_GetNextObjectID();
SDL_sensors[1].type = SDL_SENSOR_GYRO;
- SDL_sensors[1].instance_id = SDL_GetNextSensorInstanceID();
+ SDL_sensors[1].instance_id = SDL_GetNextObjectID();
return 0;
}
diff --git a/src/sensor/windows/SDL_windowssensor.c b/src/sensor/windows/SDL_windowssensor.c
index 3d209dc3391b..11fbe3ea3f52 100644
--- a/src/sensor/windows/SDL_windowssensor.c
+++ b/src/sensor/windows/SDL_windowssensor.c
@@ -315,7 +315,7 @@ static int ConnectSensor(ISensor *sensor)
++SDL_num_sensors;
SDL_zerop(new_sensor);
- new_sensor->id = SDL_GetNextSensorInstanceID();
+ new_sensor->id = SDL_GetNextObjectID();
new_sensor->sensor = sensor;
new_sensor->type = type;
new_sensor->name = name;
diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h
index 56530fbab780..cb5e4c188e82 100644
--- a/src/video/SDL_sysvideo.h
+++ b/src/video/SDL_sysvideo.h
@@ -364,7 +364,6 @@ struct SDL_VideoDevice
SDL_Window *windows;
SDL_Window *grabbed_window;
Uint8 window_magic;
- SDL_WindowID next_object_id;
Uint32 clipboard_sequence;
SDL_ClipboardDataCallback clipboard_callback;
SDL_ClipboardCleanupCallback clipboard_cleanup;
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 91f0c4b9f9e7..d68c88700476 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -517,7 +517,6 @@ int SDL_VideoInit(const char *driver_name)
pre_driver_error. */
_this = video;
_this->name = bootstrap[i]->name;
- _this->next_object_id = 1;
_this->thread = SDL_ThreadID();
/* Set some very sane GL defaults */
@@ -664,7 +663,7 @@ SDL_DisplayID SDL_AddVideoDisplay(const SDL_VideoDisplay *display, SDL_bool send
_this->displays = displays;
_this->displays[_this->num_displays++] = new_display;
- id = _this->next_object_id++;
+ id = SDL_GetNextObjectID();
SDL_memcpy(new_display, display, sizeof(*new_display));
new_display->id = id;
new_display->device = _this;
@@ -1950,7 +1949,7 @@ static SDL_Window *SDL_CreateWindowInternal(const char *title, int x, int y, int
return NULL;
}
window->magic = &_this->window_magic;
- window->id = _this->next_object_id++;
+ window->id = SDL_GetNextObjectID();
window->windowed.x = window->x = x;
window->windowed.y = window->y = y;
window->windowed.w = window->w = w;
@@ -2116,7 +2115,7 @@ SDL_Window *SDL_CreateWindowFrom(const void *data)
return NULL;
}
window->magic = &_this->window_magic;
- window->id = _this->next_object_id++;
+ window->id = SDL_GetNextObjectID();
window->flags = flags;
window->is_destroying = SDL_FALSE;
window->display_scale = 1.0f;