mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-25 06:47:19 +00:00
[all] fix numerous memory leaks at application shutdown
This commit is contained in:
parent
086f73721d
commit
4c1893fe20
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user