Переглянути джерело

Added SDL_TryLockJoysticks()

Sam Lantinga 1 місяць тому
батько
коміт
e3e8adcb76

+ 15 - 0
include/SDL3/SDL_joystick.h

@@ -188,6 +188,21 @@ typedef enum SDL_JoystickConnectionState
  */
  */
 extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock);
 extern SDL_DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock);
 
 
+/**
+ * Locking for atomic access to the joystick API.
+ *
+ * The SDL joystick functions are thread-safe, however you can lock the
+ * joysticks while processing to guarantee that the joystick list won't change
+ * and joystick and gamepad events will not be delivered.
+ *
+ * \returns true if the joysticks were successfully locked, false otherwise.
+ *
+ * \threadsafety It is safe to call this function from any thread.
+ *
+ * \since This function is available since SDL 3.2.0.
+ */
+extern SDL_DECLSPEC bool SDLCALL SDL_TryLockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock);
+
 /**
 /**
  * Unlocking for atomic access to the joystick API.
  * Unlocking for atomic access to the joystick API.
  *
  *

+ 1 - 0
src/dynapi/SDL_dynapi.sym

@@ -1271,6 +1271,7 @@ SDL3_0.0.0 {
     SDL_LoadSurface_IO;
     SDL_LoadSurface_IO;
     SDL_LoadSurface;
     SDL_LoadSurface;
     SDL_SetWindowFillDocument;
     SDL_SetWindowFillDocument;
+    SDL_TryLockJoysticks;
     # extra symbols go here (don't modify this line)
     # extra symbols go here (don't modify this line)
   local: *;
   local: *;
 };
 };

+ 1 - 0
src/dynapi/SDL_dynapi_overrides.h

@@ -1297,3 +1297,4 @@
 #define SDL_LoadSurface_IO SDL_LoadSurface_IO_REAL
 #define SDL_LoadSurface_IO SDL_LoadSurface_IO_REAL
 #define SDL_LoadSurface SDL_LoadSurface_REAL
 #define SDL_LoadSurface SDL_LoadSurface_REAL
 #define SDL_SetWindowFillDocument SDL_SetWindowFillDocument_REAL
 #define SDL_SetWindowFillDocument SDL_SetWindowFillDocument_REAL
+#define SDL_TryLockJoysticks SDL_TryLockJoysticks_REAL

+ 1 - 0
src/dynapi/SDL_dynapi_procs.h

@@ -1305,3 +1305,4 @@ SDL_DYNAPI_PROC(SDL_Surface*,SDL_RotateSurface,(SDL_Surface *a,float b),(a,b),re
 SDL_DYNAPI_PROC(SDL_Surface*,SDL_LoadSurface_IO,(SDL_IOStream *a,bool b),(a,b),return)
 SDL_DYNAPI_PROC(SDL_Surface*,SDL_LoadSurface_IO,(SDL_IOStream *a,bool b),(a,b),return)
 SDL_DYNAPI_PROC(SDL_Surface*,SDL_LoadSurface,(const char *a),(a),return)
 SDL_DYNAPI_PROC(SDL_Surface*,SDL_LoadSurface,(const char *a),(a),return)
 SDL_DYNAPI_PROC(bool,SDL_SetWindowFillDocument,(SDL_Window *a,bool b),(a,b),return)
 SDL_DYNAPI_PROC(bool,SDL_SetWindowFillDocument,(SDL_Window *a,bool b),(a,b),return)
+SDL_DYNAPI_PROC(bool,SDL_TryLockJoysticks,(void),(),return)

+ 9 - 0
src/joystick/SDL_joystick.c

@@ -653,6 +653,15 @@ void SDL_LockJoysticks(void)
     ++SDL_joysticks_locked;
     ++SDL_joysticks_locked;
 }
 }
 
 
+bool SDL_TryLockJoysticks(void)
+{
+    if (SDL_TryLockMutex(SDL_joystick_lock)) {
+        ++SDL_joysticks_locked;
+        return true;
+    }
+    return false;
+}
+
 void SDL_UnlockJoysticks(void)
 void SDL_UnlockJoysticks(void)
 {
 {
     bool last_unlock = false;
     bool last_unlock = false;