Skip to content

Commit

Permalink
Fixed bug 2418 - Structure SDL_gestureTouch leaking
Browse files Browse the repository at this point in the history
Leonardo

Structure SDL_gestureTouch gets reallocated for every new added gesture but its never freed.

Proposed patch add the function SDL_GestureQuit() that takes care of doing that and gets called when TouchQuit is called.

Gabriel Jacobo

Thanks for the patch. I think it needs a bit of extra work though, looking at the code in SDL_gesture.c , I see that SDL_numGestureTouches only goes up, I think the right fix here involves adding SDL_GestureDelTouch (hooked into SDL_DelTouch) as well as SDL_GestureQuit (as you posted in your patch).
  • Loading branch information
slouken committed Aug 14, 2017
1 parent f142a79 commit 64dd829
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/events/SDL_gesture.c
Expand Up @@ -101,6 +101,12 @@ int SDL_RecordGesture(SDL_TouchID touchId)
return (touchId < 0);
}

void SDL_GestureQuit()
{
SDL_free(SDL_gestureTouch);
SDL_gestureTouch = NULL;
}

static unsigned long SDL_HashDollar(SDL_FloatPoint* points)
{
unsigned long hash = 5381;
Expand Down Expand Up @@ -457,6 +463,28 @@ int SDL_GestureAddTouch(SDL_TouchID touchId)
return 0;
}

int SDL_GestureDelTouch(SDL_TouchID touchId)
{
int i;
for (i = 0; i < SDL_numGestureTouches; i++) {
if (SDL_gestureTouch[i].id == touchId) {
break;
}
}

if (i == SDL_numGestureTouches) {
/* not found */
return -1;
}

SDL_free(SDL_gestureTouch[i].dollarTemplate);
SDL_zero(SDL_gestureTouch[i]);

SDL_numGestureTouches--;
SDL_gestureTouch[i] = SDL_gestureTouch[SDL_numGestureTouches];
return 0;
}

static SDL_GestureTouch * SDL_GetGestureTouch(SDL_TouchID id)
{
int i;
Expand Down
3 changes: 3 additions & 0 deletions src/events/SDL_gesture_c.h
Expand Up @@ -24,9 +24,12 @@
#define SDL_gesture_c_h_

extern int SDL_GestureAddTouch(SDL_TouchID touchId);
extern int SDL_GestureDelTouch(SDL_TouchID touchId);

extern void SDL_GestureProcessEvent(SDL_Event* event);

extern void SDL_GestureQuit(void);

#endif /* SDL_gesture_c_h_ */

/* vi: set ts=4 sw=4 expandtab: */
4 changes: 4 additions & 0 deletions src/events/SDL_touch.c
Expand Up @@ -352,6 +352,9 @@ SDL_DelTouch(SDL_TouchID id)

SDL_num_touch--;
SDL_touchDevices[index] = SDL_touchDevices[SDL_num_touch];

/* Delete this touch device for gestures */
SDL_GestureDelTouch(id);
}

void
Expand All @@ -366,6 +369,7 @@ SDL_TouchQuit(void)

SDL_free(SDL_touchDevices);
SDL_touchDevices = NULL;
SDL_GestureQuit();
}

/* vi: set ts=4 sw=4 expandtab: */

0 comments on commit 64dd829

Please sign in to comment.