Fix segfault on exit in unichrome driver (bug 16150)
authorLuc Verhaegen <libv@skynet.be>
Thu, 29 May 2008 17:00:06 +0000 (11:00 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 29 May 2008 17:00:06 +0000 (11:00 -0600)
src/mesa/drivers/dri/unichrome/via_context.c

index bbb198bf0e8b34a3d01773aaec37682821e24ac9..d9b4f2d112ab3f8eac107573438c06365c5a81b8 100644 (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);
 }