summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcin Slusarz <marcin.slusarz@gmail.com>2010-01-18 10:48:06 -0700
committerBrian Paul <brianp@vmware.com>2010-01-18 10:48:06 -0700
commite978b24c87be6d7572ed3272e6b186d5c54fb414 (patch)
treec2368621fd3b504aee092efd26657e1625dc495d
parent23ae31820042f2bc4694f7c48696a697d674b802 (diff)
downloadexternal_mesa3d-e978b24c87be6d7572ed3272e6b186d5c54fb414.zip
external_mesa3d-e978b24c87be6d7572ed3272e6b186d5c54fb414.tar.gz
external_mesa3d-e978b24c87be6d7572ed3272e6b186d5c54fb414.tar.bz2
st/dri: fix optionCache memory leaks
Signed-off-by: Brian Paul <brianp@vmware.com>
-rw-r--r--src/gallium/state_trackers/dri/dri_context.c6
-rw-r--r--src/gallium/state_trackers/dri/dri_screen.c10
2 files changed, 16 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c
index 8819936..cd9d8b6 100644
--- a/src/gallium/state_trackers/dri/dri_context.c
+++ b/src/gallium/state_trackers/dri/dri_context.c
@@ -101,6 +101,12 @@ dri_destroy_context(__DRIcontextPrivate * cPriv)
{
struct dri_context *ctx = dri_context(cPriv);
+ /* note: we are freeing values and nothing more because
+ * driParseConfigFiles allocated values only - the rest
+ * is owned by screen optionCache.
+ */
+ FREE(ctx->optionCache.values);
+
/* No particular reason to wait for command completion before
* destroying a context, but it is probably worthwhile flushing it
* to avoid having to add code elsewhere to cope with flushing a
diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c
index 11ea28b..d95c627 100644
--- a/src/gallium/state_trackers/dri/dri_screen.c
+++ b/src/gallium/state_trackers/dri/dri_screen.c
@@ -327,8 +327,18 @@ static void
dri_destroy_screen(__DRIscreenPrivate * sPriv)
{
struct dri_screen *screen = dri_screen(sPriv);
+ int i;
screen->pipe_screen->destroy(screen->pipe_screen);
+
+ for (i = 0; i < (1 << screen->optionCache.tableSize); ++i) {
+ FREE(screen->optionCache.info[i].name);
+ FREE(screen->optionCache.info[i].ranges);
+ }
+
+ FREE(screen->optionCache.info);
+ FREE(screen->optionCache.values);
+
FREE(screen);
sPriv->private = NULL;
}