From 76e5aa5bfd983a887f1cf4f9ee438953812c31d8 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 3 Jun 2024 04:26:14 -0700 Subject: [PATCH] Log any leaked objects at shutdown --- src/SDL_utils.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/SDL_utils.c b/src/SDL_utils.c index 7efbe44005..222cf49a3e 100644 --- a/src/SDL_utils.c +++ b/src/SDL_utils.c @@ -161,6 +161,47 @@ SDL_bool SDL_ObjectValid(void *object, SDL_ObjectType type) void SDL_SetObjectsInvalid(void) { if (SDL_objects) { + /* Log any leaked objects */ + const void *object, *object_type; + void *iter = NULL; + while (SDL_IterateHashTable(SDL_objects, &object, &object_type, &iter)) { + const char *type; + switch ((SDL_ObjectType)(uintptr_t)object_type) { + case SDL_OBJECT_TYPE_WINDOW: + type = "SDL_Window"; + break; + case SDL_OBJECT_TYPE_RENDERER: + type = "SDL_Renderer"; + break; + case SDL_OBJECT_TYPE_TEXTURE: + type = "SDL_Texture"; + break; + case SDL_OBJECT_TYPE_JOYSTICK: + type = "SDL_Joystick"; + break; + case SDL_OBJECT_TYPE_GAMEPAD: + type = "SDL_Gamepad"; + break; + case SDL_OBJECT_TYPE_HAPTIC: + type = "SDL_Haptic"; + break; + case SDL_OBJECT_TYPE_SENSOR: + type = "SDL_Sensor"; + break; + case SDL_OBJECT_TYPE_HIDAPI_DEVICE: + type = "hidapi device"; + break; + case SDL_OBJECT_TYPE_HIDAPI_JOYSTICK: + type = "hidapi joystick"; + break; + default: + type = "unknown object"; + break; + } + SDL_Log("Leaked %s (%p)\n", type, object); + } + SDL_assert(SDL_HashTableEmpty(SDL_objects)); + SDL_DestroyHashTable(SDL_objects); SDL_objects = NULL; }