Fix segfault on exit in unichrome driver (bug 16150)

This commit is contained in:
Luc Verhaegen 2008-05-29 11:00:06 -06:00 committed by Brian Paul
parent ef56a563a1
commit 4a69c4173d
1 changed files with 29 additions and 27 deletions

View File

@ -679,46 +679,48 @@ void
viaDestroyContext(__DRIcontextPrivate *driContextPriv)
{
GET_CURRENT_CONTEXT(ctx);
struct via_context *vmesa =
struct via_context *vmesa =
(struct via_context *)driContextPriv->driverPrivate;
struct via_context *current = ctx ? VIA_CONTEXT(ctx) : NULL;
assert(vmesa); /* should never be null */
if (vmesa->driDrawable) {
viaWaitIdle(vmesa, GL_FALSE);
if (vmesa->doPageFlip) {
LOCK_HARDWARE(vmesa);
if (vmesa->pfCurrentOffset != 0) {
fprintf(stderr, "%s - reset pf\n", __FUNCTION__);
viaResetPageFlippingLocked(vmesa);
}
UNLOCK_HARDWARE(vmesa);
}
}
/* check if we're deleting the currently bound context */
if (vmesa == current) {
VIA_FLUSH_DMA(vmesa);
_mesa_make_current(NULL, NULL, NULL);
}
if (vmesa) {
viaWaitIdle(vmesa, GL_FALSE);
if (vmesa->doPageFlip) {
LOCK_HARDWARE(vmesa);
if (vmesa->pfCurrentOffset != 0) {
fprintf(stderr, "%s - reset pf\n", __FUNCTION__);
viaResetPageFlippingLocked(vmesa);
}
UNLOCK_HARDWARE(vmesa);
}
_swsetup_DestroyContext(vmesa->glCtx);
_tnl_DestroyContext(vmesa->glCtx);
_vbo_DestroyContext(vmesa->glCtx);
_swrast_DestroyContext(vmesa->glCtx);
/* free the Mesa context */
_mesa_destroy_context(vmesa->glCtx);
/* release our data */
FreeBuffer(vmesa);
_swsetup_DestroyContext(vmesa->glCtx);
_tnl_DestroyContext(vmesa->glCtx);
_vbo_DestroyContext(vmesa->glCtx);
_swrast_DestroyContext(vmesa->glCtx);
/* free the Mesa context */
_mesa_destroy_context(vmesa->glCtx);
/* release our data */
FreeBuffer(vmesa);
assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_AGP]));
assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_VIDEO]));
assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_SYSTEM]));
assert (is_empty_list(&vmesa->freed_tex_buffers));
assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_AGP]));
assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_VIDEO]));
assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_SYSTEM]));
assert (is_empty_list(&vmesa->freed_tex_buffers));
driDestroyOptionCache(&vmesa->optionCache);
driDestroyOptionCache(&vmesa->optionCache);
FREE(vmesa);
}
FREE(vmesa);
}