java-topology/defects/sdl3/patch/sdl3-0001-mapping-change-hash-set.patch

64 lines
2.2 KiB
Diff

--- a/src/joystick/SDL_gamepad.c
+++ b/src/joystick/SDL_gamepad.c
@@ -108,6 +108,7 @@ typedef struct
{
int refcount _guarded;
SDL_JoystickID *joysticks _guarded;
GamepadMapping_t **joystick_mappings _guarded;
int num_changed_mappings _guarded;
GamepadMapping_t **changed_mappings _guarded;
+ SDL_HashTable *changed_mappings_set _guarded; // O(1) pointer membership
} MappingChangeTracker;
@@ -595,6 +596,11 @@ static void PushMappingChangeTracking(void)
s_mappingChangeTracker = (MappingChangeTracker *)SDL_calloc(1, sizeof(*tracker));
...
+ tracker->changed_mappings_set = SDL_CreateHashTable(
+ 0, false, SDL_HashPointer, SDL_KeyMatchPointer, NULL, NULL);
@@ -627,6 +633,10 @@ static void AddMappingChangeTracking(GamepadMapping_t *mapping)
tracker->changed_mappings[num_mappings] = mapping;
tracker->num_changed_mappings = (num_mappings + 1);
}
+ // Mirror into hash set for O(1) HasMappingChangeTracking queries.
+ if (tracker->changed_mappings_set) {
+ SDL_InsertIntoHashTable(tracker->changed_mappings_set,
+ (void *)mapping, (const void *)true, false);
+ }
}
@@ -639,13 +639,10 @@ static bool HasMappingChangeTracking(MappingChangeTracker *tracker, GamepadMappi
{
- int i;
-
SDL_AssertJoysticksLocked();
- for (i = 0; i < tracker->num_changed_mappings; ++i) {
- if (tracker->changed_mappings[i] == mapping) {
- return true;
- }
- }
- return false;
+ if (!tracker->changed_mappings_set) {
+ // Fallback: linear scan (allocation failure path).
+ int i;
+ for (i = 0; i < tracker->num_changed_mappings; ++i) {
+ if (tracker->changed_mappings[i] == mapping) {
+ return true;
+ }
+ }
+ return false;
+ }
+ const void *value;
+ return SDL_FindInHashTable(tracker->changed_mappings_set, (void *)mapping, &value);
}
@@ -698,6 +698,10 @@ static void PopMappingChangeTracking(void)
SDL_free(tracker->joysticks);
SDL_free(tracker->joystick_mappings);
SDL_free(tracker->changed_mappings);
+ if (tracker->changed_mappings_set) {
+ SDL_DestroyHashTable(tracker->changed_mappings_set);
+ }
SDL_free(tracker);
}