mesa: Free all shader program data before deleting all

shader/shader program objects to avoid memory access error.
This commit is contained in:
Xiang, Haihao
2008-03-31 17:02:47 +08:00
parent aef47c4dc8
commit 63d8a8417d
2 changed files with 18 additions and 0 deletions
+16
View File
@@ -622,6 +622,21 @@ delete_arrayobj_cb(GLuint id, void *data, void *userData)
_mesa_delete_array_object(ctx, arrayObj);
}
/**
* Callback for freeing shader program data. Call it before delete_shader_cb
* to avoid memory access error.
*/
static void
free_shader_program_data_cb(GLuint id, void *data, void *userData)
{
GLcontext *ctx = (GLcontext *) userData;
struct gl_shader_program *shProg = (struct gl_shader_program *) data;
if (shProg->Type == GL_SHADER_PROGRAM_MESA) {
_mesa_free_shader_program_data(ctx, shProg);
}
}
/**
* Callback for deleting shader and shader programs objects.
* Called by _mesa_HashDeleteAll().
@@ -721,6 +736,7 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
_mesa_DeleteHashTable(ss->ArrayObjects);
#if FEATURE_ARB_shader_objects
_mesa_HashWalk(ss->ShaderObjects, free_shader_program_data_cb, ctx);
_mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx);
_mesa_DeleteHashTable(ss->ShaderObjects);
#endif
+2
View File
@@ -127,6 +127,8 @@ _mesa_free_shader_program_data(GLcontext *ctx,
for (i = 0; i < shProg->NumShaders; i++) {
_mesa_reference_shader(ctx, &shProg->Shaders[i], NULL);
}
shProg->NumShaders = 0;
if (shProg->Shaders) {
_mesa_free(shProg->Shaders);
shProg->Shaders = NULL;