Mon 25 Jun 2007 11:04:37 PM UTC, original submission:
Occurs while watching http://www.endofworld.net/endofworld.swf
This assertion failure would be a crash in a release build that skipped assertions.
This assertion failure is dependent on a race condition (which seems to disappear entirely when operating with a system load lesser than the number of CPU cores present.)
When played with sound disabled, the assertion failure, naturally, does not occur.
When the assertion failure does not occur, at this point in the movie, the movie rewinds to the beginning for no apparent reason.
Command-line output:
donny@disqplay:~$ ./gnash/gui/.libs/gnash endofworld.swf
- (gnash:2989): WARNING **: Couldn't find pixmap file: GnashG.png
gnash: sound_handler_sdl.cpp:535: uint8_t* active_sound::get_data_ptr(long unsigned int): Assertion `data_size > pos' failed.
Aborted
GDB offers some more insight:
Program received signal SIGABRT, Aborted.
[Switching to Thread -1267729488 (LWP 3007)]
0xb7f8f410 in ?? ()
(gdb) bt
#0 0xb7f8f410 in ?? ()
#1 0xb46ff188 in ?? ()
#2 0x00000006 in ?? ()
#3 0x00000bbf in ?? ()
#4 0xb7b0f811 in raise () from /lib/tls/i686/cmov/libc.so.6
#5 0xb7b10fb9 in abort () from /lib/tls/i686/cmov/libc.so.6
#6 0xb7b08fbf in __assert_fail () from /lib/tls/i686/cmov/libc.so.6
#7 0xb670c223 in active_sound::get_data_ptr (this=0xb474b448, pos=98919) at sound_handler_sdl.cpp:535
#8 0xb670cafe in SDL_sound_handler::sdl_audio_callback (this=0x8052800, stream=0x88b4fb0 "", buffer_length=8192) at sound_handler_sdl.cpp:777
#9 0xb670d057 in SDL_sound_handler::sdl_audio_callback (udata=0x8052800, stream=0x88b4fb0 "", buffer_length_in=8192) at sound_handler_sdl.cpp:654
#10 0xb65dcd5d in SDL_AudioInit () from /usr/lib/libSDL-1.2.so.0
#11 0xb65e582b in SDL_GetThreadID () from /usr/lib/libSDL-1.2.so.0
#12 0xb6632c8d in SDL_ThreadID () from /usr/lib/libSDL-1.2.so.0
#13 0xb6f25240 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
#14 0xb7bb23de in clone () from /lib/tls/i686/cmov/libc.so.6
(gdb) up 7
#7 0xb670c223 in active_sound::get_data_ptr (this=0xb474b448, pos=98919) at sound_handler_sdl.cpp:535
535 assert(data_size > pos);
(gdb) print this
$1 = (active_sound * const) 0x6
I'm... just now noticing this very strange output. Previously the stack trace showed "#7 ... (this=0x6, pos=98919) ..." but now it shows this=0xb474b448. However clearly when I invoke "print this" it shows the old value of 0x6. I'm not sure what this is about.
The race condition seems to be that the static SDL_sound_handler::sdl_audio_handler() callback function is being invoked by SDL after sound data has either been deleted, or corrupted in some fashion.
|