nouveau: fix winsys object leak
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Sun, 17 Jan 2010 22:50:50 +0000 (23:50 +0100)
committerBen Skeggs <bskeggs@redhat.com>
Sun, 24 Jan 2010 23:43:33 +0000 (09:43 +1000)
src/gallium/drivers/nouveau/nouveau_screen.c
src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c

index 7ebc94ed6c7f2b37d6f4d6fa230295581a88fdab..1ad539d28582e7786eedbfa2e2d349d5ea0e2aab 100644 (file)
@@ -260,6 +260,8 @@ nouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev)
 void
 nouveau_screen_fini(struct nouveau_screen *screen)
 {
+       struct pipe_winsys *ws = screen->base.winsys;
        nouveau_channel_free(&screen->channel);
+       ws->destroy(ws);
 }
 
index c9f39d815d8a9e05c13a15f0238dcc429139818a..29afff6faf82a2df570371934f18a1433938fbc3 100644 (file)
@@ -54,6 +54,14 @@ static struct dri1_api nouveau_dri1_api = {
        nouveau_dri1_front_surface,
 };
 
+static void
+nouveau_drm_destroy_winsys(struct pipe_winsys *s)
+{
+       struct nouveau_winsys *nv_winsys = nouveau_winsys(s);
+       FREE(nv_winsys->pctx);
+       FREE(nv_winsys);
+}
+
 static struct pipe_screen *
 nouveau_drm_create_screen(struct drm_api *api, int fd,
                          struct drm_create_screen_arg *arg)
@@ -105,6 +113,7 @@ nouveau_drm_create_screen(struct drm_api *api, int fd,
                return NULL;
        }
        ws = &nvws->base;
+       ws->destroy = nouveau_drm_destroy_winsys;
 
        nvws->pscreen = init(ws, dev);
        if (!nvws->pscreen) {