My first glean runs resulted in segfaults. Running electric fence in
gdb, I got this backtrace:
#0 mmAllocMem (heap=0x3598cfe8, size=262144, align2=0, startSearch=0)
at mm.c:125
#1 0x0f816614 in radeonTexturesGone (rmesa=0x3552cdf8, heap=0, offset=0,
size=262144, in_use=1) at radeon_texmem.c:262
#2 0x0f8167a0 in radeonAgeTextures (rmesa=0x3552cdf8, heap=0)
at radeon_texmem.c:301
#3 0x0f7ea870 in radeonGetLock (rmesa=0x3552cdf8, flags=262144)
at radeon_lock.c:121
#4 0x0f7e87c8 in radeonFlushCmdBuf (rmesa=0x3552cdf8,
caller=0xf846e90 "radeonFlush") at radeon_ioctl.c:441
#5 0x0f7ea2f8 in radeonFlush (ctx=0x3598cfe8) at radeon_ioctl.c:1125
#6 0x0f7e6e98 in radeonDestroyContext (driContextPriv=0x3552d5b4)
at radeon_context.c:568
#7 0x0f68dcf4 in driDestroyContext ()
from /usr/local/X11R6-DRI/lib/modules/dri/radeon_dri.so
#8 0x0fe7c738 in __glXFreeContext () from /usr/lib/libGL.so.1
#9 0x0fe7c850 in glXDestroyContext () from /usr/lib/libGL.so.1
#10 0x1000b874 in GLEAN::RenderingContext::~RenderingContext (this=0x7ffff878,
__in_chrg=805558984) at rc.cpp:152
#11 0x10056238 in GLEAN::BaseTest<GLEAN::OPResult>::run (this=0x0,
environment=@0x40000) at tbase.h:273
#12 0x10009f84 in main (argc=3, argv=0x7ffffa04) at main.cpp:121
#13 0x0fa50c50 in __libc_start_main () from /lib/libc.so.6
It's trying to allocate memory from a heap that's already been destroyed
(and thus the memory freed). How does the attached patch (which avoids
the problem) look?
--
Earthling Michel D�nzer (MrCooper)/ Debian GNU/Linux (powerpc) developer
XFree86 and DRI project member / CS student, Free Software enthusiast
Index: radeon_lock.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_lock.c,v
retrieving revision 1.10
diff -p -u -r1.10 radeon_lock.c
--- radeon_lock.c 27 Jun 2002 18:02:59 -0000 1.10
+++ radeon_lock.c 19 Oct 2002 14:40:47 -0000
@@ -117,7 +117,7 @@ void radeonGetLock( radeonContextPtr rme
sarea->ctxOwner = rmesa->dri.hwContext;
for ( i = 0 ; i < rmesa->texture.numHeaps ; i++ ) {
- if ( sarea->texAge[i] != rmesa->texture.age[i] ) {
+ if ( rmesa->texture.heap[i] && sarea->texAge[i] != rmesa->texture.age[i] ) {
radeonAgeTextures( rmesa, i );
}
}
Index: radeon_context.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v
retrieving revision 1.20
diff -p -u -r1.20 radeon_context.c
--- radeon_context.c 2 Oct 2002 12:32:45 -0000 1.20
+++ radeon_context.c 19 Oct 2002 14:40:50 -0000
@@ -546,6 +546,7 @@ radeonDestroyContext( __DRIcontextPrivat
radeonDestroyTexObj( rmesa, t );
}
mmDestroy( rmesa->texture.heap[i] );
+ rmesa->texture.heap[i] = NULL;
}
foreach_s ( t, next_t, &rmesa->texture.swapped ) {