summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2001-05-09 13:53:36 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2001-05-09 13:53:36 +0000
commitbcf749e83a4844972b8fbb84e9762a9b1ec77c5f (patch)
tree095ccd846c8bc7b02f9363506f2e1f8e8f26ca8c /src
parent335634b807921285bec0709ee92c454cee87ee88 (diff)
fix possible segfault on destroy context
Diffstat (limited to 'src')
-rw-r--r--src/mesa/tnl/t_context.c4
-rw-r--r--src/mesa/tnl/t_imm_alloc.c17
-rw-r--r--src/mesa/tnl/t_imm_exec.c5
3 files changed, 16 insertions, 10 deletions
diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c
index bea2e37650..f52820840b 100644
--- a/src/mesa/tnl/t_context.c
+++ b/src/mesa/tnl/t_context.c
@@ -1,4 +1,4 @@
-/* $Id: t_context.c,v 1.16 2001/03/19 02:25:36 keithw Exp $ */
+/* $Id: t_context.c,v 1.17 2001/05/09 13:53:36 keithw Exp $ */
/*
* Mesa 3-D graphics library
@@ -132,10 +132,8 @@ _tnl_DestroyContext( GLcontext *ctx )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
-/* _tnl_dlist_destroy( ctx ); */
_tnl_array_destroy( ctx );
_tnl_imm_destroy( ctx );
-/* _tnl_eval_destroy( ctx ); */
_tnl_destroy_pipeline( ctx );
FREE(tnl);
diff --git a/src/mesa/tnl/t_imm_alloc.c b/src/mesa/tnl/t_imm_alloc.c
index 2b497a7058..22bdb7a7bb 100644
--- a/src/mesa/tnl/t_imm_alloc.c
+++ b/src/mesa/tnl/t_imm_alloc.c
@@ -1,4 +1,4 @@
-/* $Id: t_imm_alloc.c,v 1.7 2001/04/30 21:08:52 keithw Exp $ */
+/* $Id: t_imm_alloc.c,v 1.8 2001/05/09 13:53:36 keithw Exp $ */
/*
* Mesa 3-D graphics library
@@ -118,14 +118,21 @@ struct immediate *_tnl_alloc_immediate( GLcontext *ctx )
return real_alloc_immediate( ctx );
}
+/* May be called after tnl is destroyed.
+ */
void _tnl_free_immediate( struct immediate *IM )
{
TNLcontext *tnl = TNL_CONTEXT(IM->backref);
ASSERT(IM->ref_count == 0);
- if (tnl->freed_immediate)
- real_free_immediate( tnl->freed_immediate );
-
- tnl->freed_immediate = IM;
+ if (!tnl) {
+ real_free_immediate( IM );
+ }
+ else {
+ if (tnl->freed_immediate)
+ real_free_immediate( tnl->freed_immediate );
+
+ tnl->freed_immediate = IM;
+ }
}
diff --git a/src/mesa/tnl/t_imm_exec.c b/src/mesa/tnl/t_imm_exec.c
index 25de9a2af3..adb79ab7d5 100644
--- a/src/mesa/tnl/t_imm_exec.c
+++ b/src/mesa/tnl/t_imm_exec.c
@@ -1,4 +1,4 @@
-/* $Id: t_imm_exec.c,v 1.21 2001/05/03 16:49:27 keithw Exp $ */
+/* $Id: t_imm_exec.c,v 1.22 2001/05/09 13:53:36 keithw Exp $ */
/*
* Mesa 3-D graphics library
@@ -554,7 +554,8 @@ void _tnl_imm_destroy( GLcontext *ctx )
{
if (TNL_CURRENT_IM(ctx)) {
TNL_CURRENT_IM(ctx)->ref_count--;
- _tnl_free_immediate( TNL_CURRENT_IM(ctx) );
+ if (TNL_CURRENT_IM(ctx)->ref_count == 0)
+ _tnl_free_immediate( TNL_CURRENT_IM(ctx) );
SET_IMMEDIATE(ctx, 0);
}
}