fix mem leak, add comments
authorBrian <brian@yutani.localnet.net>
Mon, 26 Mar 2007 15:23:44 +0000 (09:23 -0600)
committerBrian <brian@yutani.localnet.net>
Mon, 26 Mar 2007 15:23:44 +0000 (09:23 -0600)
src/mesa/shader/shader_api.c

index 002b42721df7eb73c465ff100b494f12997f8151..1831d0fb2e741f3697ec34009fed52cbe7e44cf3 100644 (file)
@@ -67,6 +67,10 @@ _mesa_new_shader_program(GLcontext *ctx, GLuint name)
 }
 
 
+/**
+ * Free the data that hangs off a shader program object, but not the object
+ * itself.
+ */
 void
 _mesa_free_shader_program_data(GLcontext *ctx,
                                struct gl_shader_program *shProg)
@@ -104,11 +108,17 @@ _mesa_free_shader_program_data(GLcontext *ctx,
 }
 
 
-
+/**
+ * Free/delete a shader program object.
+ */
 void
 _mesa_free_shader_program(GLcontext *ctx, struct gl_shader_program *shProg)
 {
    _mesa_free_shader_program_data(ctx, shProg);
+   if (shProg->Shaders) {
+      _mesa_free(shProg->Shaders);
+      shProg->Shaders = NULL;
+   }
    _mesa_free(shProg);
 }
 
@@ -431,6 +441,10 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader)
          /* found it */
 
          shProg->Shaders[i]->RefCount--;
+         if (shProg->Shaders[i]->RefCount == 0) {
+            /* delete now */
+            _mesa_free_shader(ctx, shProg->Shaders[i]);
+         }
 
          /* alloc new, smaller array */
          newList = (struct gl_shader **)
@@ -446,8 +460,6 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader)
             newList[j++] = shProg->Shaders[i];
          _mesa_free(shProg->Shaders);
 
-         /* XXX refcounting! */
-
          shProg->Shaders = newList;
          return;
       }