On Wed, 2007-02-28 at 10:58 -0800, Brian Paul wrote:
> 
> diff-tree f30e31276304696558abffdd9a6e3df21d41c0f5 (from 
> e21096b07c5854d01114b58f87d08709e370f8b7)
> Author: Brian <[EMAIL PROTECTED]>
> Date:   Tue Feb 27 11:09:28 2007 -0700
> 
>     assert that fb->RefCount==0 in _mesa_free_framebuffer_data()
> 
> diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c
> index d061d22..3fe70f4 100644
> --- a/src/mesa/main/framebuffer.c
> +++ b/src/mesa/main/framebuffer.c
> @@ -216,6 +216,7 @@ _mesa_free_framebuffer_data(struct gl_fr
>     GLuint i;
>  
>     assert(fb);
> +   assert(fb->RefCount == 0);
>  
>     _glthread_DESTROY_MUTEX(fb->Mutex);

This triggers for me with AIGLX (resulting in instant X server death)
when a client goes away without explicitly destroying its DRI drawables.
Here's a backtrace:

#0  0x0fc6cf6c in raise () from /lib/tls/libc.so.6
#1  0x0fc6ea0c in abort () from /lib/tls/libc.so.6
#2  0x0fc652d8 in __assert_fail () from /lib/tls/libc.so.6
#3  0x0f527c2c in _mesa_free_framebuffer_data (fb=0x10ac8e98) at 
main/framebuffer.c:219
#4  0x0f527c48 in _mesa_destroy_framebuffer (fb=0x10ac8e98) at 
main/framebuffer.c:203
#5  0x0f4d91a0 in radeonDestroyBuffer (driDrawPriv=<value optimized out>) at 
radeon_screen.c:911
#6  0x0f4d5828 in driDestroyDrawable (dpy=0x0, drawablePrivate=0x1072ae18) at 
../common/dri_util.c:710
#7  0x0f4d5194 in __driGarbageCollectDrawables (drawHash=0x102054f0) at 
../common/dri_util.c:138
#8  0x0f4d53b0 in driDestroyContext (dpy=0x0, scrn=0, 
contextPrivate=0x106c6158) at ../common/dri_util.c:752
#9  0x0f96d334 in __glXDRIcontextDestroy (baseContext=0x0) at glxdri.c:281
#10 0x0f92bb38 in __glXFreeContext (cx=0x0) at glxext.c:244
#11 0x0f92c0c0 in ClientGone (clientIndex=258957664, id=<value optimized out>) 
at glxext.c:146
#12 0x10028724 in FreeClientResources (client=0x106c6190) at resource.c:837
#13 0x1003c184 in CloseDownClient (client=0x106c6190) at dispatch.c:3626
#14 0x100431f8 in Dispatch () at dispatch.c:483
#15 0x100265d0 in main (argc=11, argv=0x7fb6ece4, envp=<value optimized out>) 
at main.c:469

radeonDestroyBuffer is called when the reference count is 1. Changing
radeonDestroyBuffer to call _mesa_dereference_framebuffer instead of
_mesa_destroy_framebuffer seems to work so far, but I'm not sure that's
the correct fix. Any ideas?


-- 
Earthling Michel Dänzer           |          http://tungstengraphics.com
Libre software enthusiast         |          Debian, X and DRI developer


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to