[all] fix numerous memory leaks at application shutdown

This commit is contained in:
Geoffrey McRae 2021-01-24 19:39:00 +11:00
parent 086f73721d
commit 4c1893fe20
5 changed files with 81 additions and 13 deletions

View File

@ -261,6 +261,7 @@ static bool x11GetProp(LG_DSProperty prop, void *ret)
maxSamples = samples; maxSamples = samples;
} }
XFree(visuals);
XCloseDisplay(dpy); XCloseDisplay(dpy);
*(int*)ret = maxSamples; *(int*)ret = maxSamples;

View File

@ -36,19 +36,21 @@ struct Inst
static bool lgf_sdl_create(LG_FontObj * opaque, const char * font_name, unsigned int size) static bool lgf_sdl_create(LG_FontObj * opaque, const char * font_name, unsigned int size)
{ {
if (g_initCount++ == 0) bool ret = false;
if (g_initCount == 0)
{ {
if (TTF_Init() < 0) if (TTF_Init() < 0)
{ {
DEBUG_ERROR("TTF_Init Failed"); DEBUG_ERROR("TTF_Init Failed");
return false; goto fail;
} }
g_fontConfig = FcInitLoadConfigAndFonts(); g_fontConfig = FcInitLoadConfigAndFonts();
if (!g_fontConfig) if (!g_fontConfig)
{ {
DEBUG_ERROR("FcInitLoadConfigAndFonts Failed"); DEBUG_ERROR("FcInitLoadConfigAndFonts Failed");
return false; goto fail_init;
} }
} }
@ -56,50 +58,95 @@ static bool lgf_sdl_create(LG_FontObj * opaque, const char * font_name, unsigned
if (!*opaque) if (!*opaque)
{ {
DEBUG_INFO("Failed to allocate %lu bytes", sizeof(struct Inst)); DEBUG_INFO("Failed to allocate %lu bytes", sizeof(struct Inst));
return false; goto fail_config;
} }
memset(*opaque, 0, sizeof(struct Inst));
memset(*opaque, 0, sizeof(struct Inst));
struct Inst * this = (struct Inst *)*opaque; struct Inst * this = (struct Inst *)*opaque;
if (!font_name) if (!font_name)
font_name = "FreeMono"; font_name = "FreeMono";
FcPattern * pat = FcNameParse((const FcChar8*)font_name); FcPattern * pat = FcNameParse((const FcChar8*)font_name);
FcConfigSubstitute (g_fontConfig, pat, FcMatchPattern); if (!pat)
{
DEBUG_ERROR("FCNameParse failed");
goto fail_opaque;
}
FcConfigSubstitute(g_fontConfig, pat, FcMatchPattern);
FcDefaultSubstitute(pat); FcDefaultSubstitute(pat);
FcResult result; FcResult result;
FcChar8 * file = NULL; FcChar8 * file = NULL;
FcPattern * font = FcFontMatch(g_fontConfig, pat, &result); FcPattern * match = FcFontMatch(g_fontConfig, pat, &result);
if (font && (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch)) if (!match)
{
DEBUG_ERROR("FcFontMatch Failed");
goto fail_parse;
}
if (FcPatternGetString(match, FC_FILE, 0, &file) == FcResultMatch)
{ {
this->font = TTF_OpenFont((char *)file, size); this->font = TTF_OpenFont((char *)file, size);
if (!this->font) if (!this->font)
{ {
DEBUG_ERROR("TTL_OpenFont Failed"); DEBUG_ERROR("TTL_OpenFont Failed");
return false; goto fail_match;
} }
} }
else else
{ {
DEBUG_ERROR("Failed to locate the requested font: %s", font_name); DEBUG_ERROR("Failed to locate the requested font: %s", font_name);
return false; goto fail_match;
} }
++g_initCount;
ret = true;
fail_match:
FcPatternDestroy(match);
fail_parse:
FcPatternDestroy(pat); FcPatternDestroy(pat);
return true; if (ret)
return true;
fail_opaque:
free(this);
*opaque = NULL;
fail_config:
if (g_initCount == 0)
{
FcConfigDestroy(g_fontConfig);
g_fontConfig = NULL;
}
fail_init:
if (g_initCount == 0)
TTF_Quit();
fail:
return false;
} }
static void lgf_sdl_destroy(LG_FontObj opaque) static void lgf_sdl_destroy(LG_FontObj opaque)
{ {
struct Inst * this = (struct Inst *)opaque; struct Inst * this = (struct Inst *)opaque;
if (this->font) if (this->font)
TTF_CloseFont(this->font); TTF_CloseFont(this->font);
free(this); free(this);
if (--g_initCount == 0) if (--g_initCount == 0)
{
FcConfigDestroy(g_fontConfig);
g_fontConfig = NULL;
TTF_Quit(); TTF_Quit();
}
} }
static LG_FontBitmap * lgf_sdl_render(LG_FontObj opaque, unsigned int fg_color, const char * text) static LG_FontBitmap * lgf_sdl_render(LG_FontObj opaque, unsigned int fg_color, const char * text)

View File

@ -242,6 +242,16 @@ void egl_deinitialize(void * opaque)
LG_LOCK_FREE(this->lock); LG_LOCK_FREE(this->lock);
eglMakeCurrent(this->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
if (this->frameContext)
eglDestroyContext(this->display, this->frameContext);
if (this->context)
eglDestroyContext(this->display, this->context);
eglTerminate(this->display);
free(this); free(this);
} }

View File

@ -154,8 +154,12 @@ void egl_splash_free(EGL_Splash ** splash)
if (!*splash) if (!*splash)
return; return;
egl_model_free(&(*splash)->bg );
egl_model_free(&(*splash)->logo); egl_model_free(&(*splash)->logo);
egl_shader_free(&(*splash)->bgShader );
egl_shader_free(&(*splash)->logoShader);
free(*splash); free(*splash);
*splash = NULL; *splash = NULL;
} }
@ -174,4 +178,4 @@ void egl_splash_render(EGL_Splash * splash, float alpha, float scaleY)
egl_model_render(splash->logo); egl_model_render(splash->logo);
glDisable(GL_BLEND); glDisable(GL_BLEND);
} }

View File

@ -223,6 +223,12 @@ void option_free(void)
state.options = NULL; state.options = NULL;
state.oCount = 0; state.oCount = 0;
for(int g = 0; g < state.gCount; ++g)
{
struct OptionGroup * group = &state.groups[g];
if (group->options)
free(group->options);
}
free(state.groups); free(state.groups);
state.groups = NULL; state.groups = NULL;
state.gCount = 0; state.gCount = 0;