[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] [bug #42548] data race to sound_handler::_inputStreams
From: |
Bastiaan Jacques |
Subject: |
[Gnash-commit] [bug #42548] data race to sound_handler::_inputStreams |
Date: |
Fri, 13 Jun 2014 09:15:42 +0000 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0 |
URL:
<http://savannah.gnu.org/bugs/?42548>
Summary: data race to sound_handler::_inputStreams
Project: Gnash - The GNU Flash player
Submitted by: bjacques
Submitted on: Fri 13 Jun 2014 11:15:41 AM CEST
Category: sound
Severity: 4 - Important
Release: None
Status: None
Privacy: Public
Assigned to: None
Open/Closed: Open
Discussion Lock: Any
_______________________________________________________
Details:
Threa sanitizer shows, when playing gangsta_rap_se.swf:
==================
WARNING: ThreadSanitizer: data race (pid=24027)
Read of size 8 at 0x7d380000deb8 by main thread:
#0 std::_Rb_tree<gnash::sound::InputStream*, gnash::sound::InputStream*,
std::_Identity<gnash::sound::InputStream*>,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*> >::empty() const
/usr/include/c++/4.9.0/bits/stl_tree.h:768
(libgnashsound-0.8.11dev.so+0x000000016e01)
#1 std::set<gnash::sound::InputStream*,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*> >::empty() const
/usr/include/c++/4.9.0/bits/stl_set.h:405
(libgnashsound-0.8.11dev.so+0x000000016e01)
#2 gnash::sound::sound_handler::streamingSound() const
/home/bastiaan/gnash/libsound/sound_handler.cpp:646
(libgnashsound-0.8.11dev.so+0x000000016e01)
#3 gnash::movie_root::advance()
/home/bastiaan/gnash/libcore/movie_root.cpp:864
(libgnashcore-0.8.11dev.so+0x0000000edb74)
#4 gnash::Gui::advanceMovie(bool) /home/bastiaan/gnash/gui/gui.cpp:954
(lt-gtk-gnash+0x00000004519b)
#5 gnash::Gui::advance_movie(gnash::Gui*)
/home/bastiaan/gnash/gui/gui.h:273 (lt-gtk-gnash+0x00000006b3ba)
#6 <null> <null>:0 (libglib-2.0.so.0+0x003e80849e42)
#7 gnash::Player::run(int, char**, std::string const&, std::string const&)
/home/bastiaan/gnash/gui/Player.cpp:664 (lt-gtk-gnash+0x000000053ae4)
#8 playFile(gnash::Player&, int, char**, std::string const&)
/home/bastiaan/gnash/gui/gnash.cpp:92 (lt-gtk-gnash+0x000000017a27)
#9 __call<void, std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, 0ul, 1ul, 2ul, 3ul>
/usr/include/c++/4.9.0/functional:1264 (lt-gtk-gnash+0x00000001bb40)
#10 operator()<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, void> /usr/include/c++/4.9.0/functional:1323
(lt-gtk-gnash+0x00000001bb40)
#11 for_each<__gnu_cxx::__normal_iterator<std::basic_string<char>*,
std::vector<std::basic_string<char> > >, std::_Bind<void
(*(std::reference_wrapper<gnash::Player>, int, char**,
std::_Placeholder<1>))(gnash::Player&, int, char**, const
std::basic_string<char>&)> > /usr/include/c++/4.9.0/bits/stl_algo.h:3755
(lt-gtk-gnash+0x00000001bb40)
#12 main /home/bastiaan/gnash/gui/gnash.cpp:176
(lt-gtk-gnash+0x00000001bb40)
Previous write of size 8 at 0x7d380000deb8 by thread T5 (mutexes: write
M301385, write M986):
#0 std::_Rb_tree<gnash::sound::InputStream*, gnash::sound::InputStream*,
std::_Identity<gnash::sound::InputStream*>,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*>
>::_M_erase_aux(std::_Rb_tree_const_iterator<gnash::sound::InputStream*>)
/usr/include/c++/4.9.0/bits/stl_tree.h:1868
(libgnashsound-0.8.11dev.so+0x00000001b986)
#1 std::_Rb_tree<gnash::sound::InputStream*, gnash::sound::InputStream*,
std::_Identity<gnash::sound::InputStream*>,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*>
>::erase[abi:cxx11](std::_Rb_tree_const_iterator<gnash::sound::InputStream*>)
/usr/include/c++/4.9.0/bits/stl_tree.h:857
(libgnashsound-0.8.11dev.so+0x00000001b986)
#2 std::_Rb_tree<gnash::sound::InputStream*, gnash::sound::InputStream*,
std::_Identity<gnash::sound::InputStream*>,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*>
>::_M_erase_aux(std::_Rb_tree_const_iterator<gnash::sound::InputStream*>,
std::_Rb_tree_const_iterator<gnash::sound::InputStream*>)
/usr/include/c++/4.9.0/bits/stl_tree.h:1881
(libgnashsound-0.8.11dev.so+0x00000001b986)
#3 std::_Rb_tree<gnash::sound::InputStream*, gnash::sound::InputStream*,
std::_Identity<gnash::sound::InputStream*>,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*>
>::erase[abi:cxx11](std::_Rb_tree_const_iterator<gnash::sound::InputStream*>,
std::_Rb_tree_const_iterator<gnash::sound::InputStream*>)
/usr/include/c++/4.9.0/bits/stl_tree.h:890
(libgnashsound-0.8.11dev.so+0x00000001b986)
#4 std::_Rb_tree<gnash::sound::InputStream*, gnash::sound::InputStream*,
std::_Identity<gnash::sound::InputStream*>,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*> >::erase(gnash::sound::InputStream*
const&) /usr/include/c++/4.9.0/bits/stl_tree.h:1892
(libgnashsound-0.8.11dev.so+0x00000001b986)
#5 std::set<gnash::sound::InputStream*,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*> >::erase(gnash::sound::InputStream*
const&) /usr/include/c++/4.9.0/bits/stl_set.h:621
(libgnashsound-0.8.11dev.so+0x00000001aba2)
#6 gnash::sound::sound_handler::unplugCompletedInputStreams()
/home/bastiaan/gnash/libsound/sound_handler.cpp:682
(libgnashsound-0.8.11dev.so+0x00000001aba2)
#7 gnash::sound::sound_handler::fetchSamples(short*, unsigned int)
/home/bastiaan/gnash/libsound/sound_handler.cpp:607
(libgnashsound-0.8.11dev.so+0x00000001b37b)
#8 gnash::sound::SDL_sound_handler::fetchSamples(short*, unsigned int)
/home/bastiaan/gnash/libsound/sdl/sound_handler_sdl.cpp:243
(libgnashsound-0.8.11dev.so+0x000000023f72)
#9 gnash::sound::SDL_sound_handler::sdl_audio_callback(void*, unsigned
char*, int) /home/bastiaan/gnash/libsound/sdl/sound_handler_sdl.cpp:282
(libgnashsound-0.8.11dev.so+0x000000025214)
#10 <null> <null>:0 (libSDL-1.2.so.0+0x003fb9e08f98)
Location is heap block of size 224 at 0x7d380000de40 allocated by main
thread:
#0 operator new(unsigned long) <null>:0 (libtsan.so.0+0x00000004cb42)
#1 gnash::sound::create_sound_handler_sdl(gnash::media::MediaHandler*)
/home/bastiaan/gnash/libsound/sdl/sound_handler_sdl.cpp:236
(libgnashsound-0.8.11dev.so+0x000000024744)
#2 gnash::Player::init_sound() /home/bastiaan/gnash/gui/Player.cpp:279
(lt-gtk-gnash+0x00000005005c)
#3 gnash::Player::run(int, char**, std::string const&, std::string const&)
/home/bastiaan/gnash/gui/Player.cpp:449 (lt-gtk-gnash+0x000000052126)
#4 playFile(gnash::Player&, int, char**, std::string const&)
/home/bastiaan/gnash/gui/gnash.cpp:92 (lt-gtk-gnash+0x000000017a27)
#5 __call<void, std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, 0ul, 1ul, 2ul, 3ul>
/usr/include/c++/4.9.0/functional:1264 (lt-gtk-gnash+0x00000001bb40)
#6 operator()<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, void> /usr/include/c++/4.9.0/functional:1323
(lt-gtk-gnash+0x00000001bb40)
#7 for_each<__gnu_cxx::__normal_iterator<std::basic_string<char>*,
std::vector<std::basic_string<char> > >, std::_Bind<void
(*(std::reference_wrapper<gnash::Player>, int, char**,
std::_Placeholder<1>))(gnash::Player&, int, char**, const
std::basic_string<char>&)> > /usr/include/c++/4.9.0/bits/stl_algo.h:3755
(lt-gtk-gnash+0x00000001bb40)
#8 main /home/bastiaan/gnash/gui/gnash.cpp:176
(lt-gtk-gnash+0x00000001bb40)
Mutex M301385 created at:
#0 pthread_mutex_init <null>:0 (libtsan.so.0+0x00000004a8b8)
#1 SDL_CreateMutex <null>:0 (libSDL-1.2.so.0+0x003fb9e551cc)
#2
gnash::sound::SDL_sound_handler::plugInputStream(std::unique_ptr<gnash::sound::InputStream,
std::default_delete<gnash::sound::InputStream> >)
/home/bastiaan/gnash/libsound/sdl/sound_handler_sdl.cpp:309
(libgnashsound-0.8.11dev.so+0x000000024821)
#3 gnash::sound::sound_handler::startSound(int, int,
std::vector<gnash::sound::SoundEnvelope,
std::allocator<gnash::sound::SoundEnvelope> > const*, bool, unsigned int,
unsigned int) /home/bastiaan/gnash/libsound/sound_handler.cpp:529
(libgnashsound-0.8.11dev.so+0x00000001a9da)
#4 gnash::SWF::StartSoundTag::executeActions(gnash::MovieClip*,
gnash::DisplayList&) const
/home/bastiaan/gnash/libcore/swf/StartSoundTag.cpp:103
(libgnashcore-0.8.11dev.so+0x00000016012d)
#5 gnash::MovieClip::executeFrameTags(unsigned long, gnash::DisplayList&,
int) /home/bastiaan/gnash/libcore/MovieClip.cpp:1059
(libgnashcore-0.8.11dev.so+0x00000010bbac)
#6 gnash::MovieClip::goto_frame(unsigned long)
/home/bastiaan/gnash/libcore/MovieClip.cpp:1167
(libgnashcore-0.8.11dev.so+0x00000010e857)
#7 ActionGotoFrame /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:558
(libgnashcore-0.8.11dev.so+0x00000033fd4a)
#8 gnash::SWF::ActionHandler::execute(gnash::ActionExec&) const
/home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:238
(libgnashcore-0.8.11dev.so+0x00000032f469)
#9 gnash::SWF::SWFHandlers::execute(gnash::SWF::ActionType,
gnash::ActionExec&) const /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:431
(libgnashcore-0.8.11dev.so+0x000000347239)
#10 gnash::ActionExec::operator()()
/home/bastiaan/gnash/libcore/vm/ActionExec.cpp:258
(libgnashcore-0.8.11dev.so+0x00000034fba0)
#11 gnash::GlobalCode::execute()
/home/bastiaan/gnash/libcore/vm/ExecutableCode.h:75
(libgnashcore-0.8.11dev.so+0x0000000f0750)
#12 gnash::movie_root::processActionQueue(unsigned long)
/home/bastiaan/gnash/libcore/movie_root.cpp:1403
(libgnashcore-0.8.11dev.so+0x0000000dcfd3)
#13 gnash::movie_root::processActionQueue()
/home/bastiaan/gnash/libcore/movie_root.cpp:1481
(libgnashcore-0.8.11dev.so+0x0000000dd279)
#14 gnash::movie_root::advanceMovie()
/home/bastiaan/gnash/libcore/movie_root.cpp:982
(libgnashcore-0.8.11dev.so+0x0000000dea4c)
#15 gnash::movie_root::advance()
/home/bastiaan/gnash/libcore/movie_root.cpp:933
(libgnashcore-0.8.11dev.so+0x0000000ee249)
#16 gnash::Gui::advanceMovie(bool) /home/bastiaan/gnash/gui/gui.cpp:954
(lt-gtk-gnash+0x00000004519b)
#17 gnash::Gui::advance_movie(gnash::Gui*)
/home/bastiaan/gnash/gui/gui.h:273 (lt-gtk-gnash+0x00000006b3ba)
#18 <null> <null>:0 (libglib-2.0.so.0+0x003e80849e42)
#19 gnash::Player::run(int, char**, std::string const&, std::string
const&) /home/bastiaan/gnash/gui/Player.cpp:664 (lt-gtk-gnash+0x000000053ae4)
#20 playFile(gnash::Player&, int, char**, std::string const&)
/home/bastiaan/gnash/gui/gnash.cpp:92 (lt-gtk-gnash+0x000000017a27)
#21 __call<void, std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, 0ul, 1ul, 2ul, 3ul>
/usr/include/c++/4.9.0/functional:1264 (lt-gtk-gnash+0x00000001bb40)
#22 operator()<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, void> /usr/include/c++/4.9.0/functional:1323
(lt-gtk-gnash+0x00000001bb40)
#23 for_each<__gnu_cxx::__normal_iterator<std::basic_string<char>*,
std::vector<std::basic_string<char> > >, std::_Bind<void
(*(std::reference_wrapper<gnash::Player>, int, char**,
std::_Placeholder<1>))(gnash::Player&, int, char**, const
std::basic_string<char>&)> > /usr/include/c++/4.9.0/bits/stl_algo.h:3755
(lt-gtk-gnash+0x00000001bb40)
#24 main /home/bastiaan/gnash/gui/gnash.cpp:176
(lt-gtk-gnash+0x00000001bb40)
Mutex M986 created at:
#0 pthread_mutex_lock <null>:0 (libtsan.so.0+0x00000003ae63)
#1 __gthread_mutex_lock
/usr/include/c++/4.9.0/x86_64-redhat-linux/bits/gthr-default.h:748
(libgnashsound-0.8.11dev.so+0x000000023bf8)
#2 std::mutex::lock() /usr/include/c++/4.9.0/mutex:134
(libgnashsound-0.8.11dev.so+0x000000023bf8)
#3 lock_guard /usr/include/c++/4.9.0/mutex:376
(libgnashsound-0.8.11dev.so+0x000000023bf8)
#4
gnash::sound::SDL_sound_handler::createStreamingSound(gnash::media::SoundInfo
const&) /home/bastiaan/gnash/libsound/sdl/sound_handler_sdl.cpp:138
(libgnashsound-0.8.11dev.so+0x000000023bf8)
#5 gnash::SWF::SoundStreamHeadTag::loader(gnash::SWFStream&,
gnash::SWF::TagType, gnash::movie_definition&, gnash::RunResources const&)
/home/bastiaan/gnash/libcore/swf/SoundStreamHeadTag.cpp:159
(libgnashcore-0.8.11dev.so+0x00000015ff6f)
#6 gnash::SWFParser::read(long)
/home/bastiaan/gnash/libcore/parser/SWFParser.cpp:96
(libgnashcore-0.8.11dev.so+0x00000031835e)
#7 gnash::SWFMovieDefinition::read_all_swf()
/home/bastiaan/gnash/libcore/parser/SWFMovieDefinition.cpp:467
(libgnashcore-0.8.11dev.so+0x000000324895)
#8 operator()<, void> /usr/include/c++/4.9.0/functional:569
(libgnashcore-0.8.11dev.so+0x0000003271ad)
#9 _M_invoke<0ul> /usr/include/c++/4.9.0/functional:1700
(libgnashcore-0.8.11dev.so+0x0000003271ad)
#10 std::_Bind_simple<std::_Mem_fn<void (gnash::SWFMovieDefinition::*)()>
(gnash::SWFMovieDefinition*)>::operator()()
/usr/include/c++/4.9.0/functional:1688
(libgnashcore-0.8.11dev.so+0x0000003271ad)
#11 std::thread::_Impl<std::_Bind_simple<std::_Mem_fn<void
(gnash::SWFMovieDefinition::*)()> (gnash::SWFMovieDefinition*)> >::_M_run()
/usr/include/c++/4.9.0/thread:115 (libgnashcore-0.8.11dev.so+0x0000003271ad)
#12 <null> <null>:0 (libstdc++.so.6+0x003af5ebae5f)
Thread T5 (tid=24035, running) created by main thread at:
#0 pthread_create <null>:0 (libtsan.so.0+0x00000004ac26)
#1 <null> <null>:0 (libSDL-1.2.so.0+0x003fb9e54d4a)
#2
gnash::sound::SDL_sound_handler::plugInputStream(std::unique_ptr<gnash::sound::InputStream,
std::default_delete<gnash::sound::InputStream> >)
/home/bastiaan/gnash/libsound/sdl/sound_handler_sdl.cpp:309
(libgnashsound-0.8.11dev.so+0x000000024821)
#3 gnash::sound::sound_handler::startSound(int, int,
std::vector<gnash::sound::SoundEnvelope,
std::allocator<gnash::sound::SoundEnvelope> > const*, bool, unsigned int,
unsigned int) /home/bastiaan/gnash/libsound/sound_handler.cpp:529
(libgnashsound-0.8.11dev.so+0x00000001a9da)
#4 gnash::SWF::StartSoundTag::executeActions(gnash::MovieClip*,
gnash::DisplayList&) const
/home/bastiaan/gnash/libcore/swf/StartSoundTag.cpp:103
(libgnashcore-0.8.11dev.so+0x00000016012d)
#5 gnash::MovieClip::executeFrameTags(unsigned long, gnash::DisplayList&,
int) /home/bastiaan/gnash/libcore/MovieClip.cpp:1059
(libgnashcore-0.8.11dev.so+0x00000010bbac)
#6 gnash::MovieClip::goto_frame(unsigned long)
/home/bastiaan/gnash/libcore/MovieClip.cpp:1167
(libgnashcore-0.8.11dev.so+0x00000010e857)
#7 ActionGotoFrame /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:558
(libgnashcore-0.8.11dev.so+0x00000033fd4a)
#8 gnash::SWF::ActionHandler::execute(gnash::ActionExec&) const
/home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:238
(libgnashcore-0.8.11dev.so+0x00000032f469)
#9 gnash::SWF::SWFHandlers::execute(gnash::SWF::ActionType,
gnash::ActionExec&) const /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:431
(libgnashcore-0.8.11dev.so+0x000000347239)
#10 gnash::ActionExec::operator()()
/home/bastiaan/gnash/libcore/vm/ActionExec.cpp:258
(libgnashcore-0.8.11dev.so+0x00000034fba0)
#11 gnash::GlobalCode::execute()
/home/bastiaan/gnash/libcore/vm/ExecutableCode.h:75
(libgnashcore-0.8.11dev.so+0x0000000f0750)
#12 gnash::movie_root::processActionQueue(unsigned long)
/home/bastiaan/gnash/libcore/movie_root.cpp:1403
(libgnashcore-0.8.11dev.so+0x0000000dcfd3)
#13 gnash::movie_root::processActionQueue()
/home/bastiaan/gnash/libcore/movie_root.cpp:1481
(libgnashcore-0.8.11dev.so+0x0000000dd279)
#14 gnash::movie_root::advanceMovie()
/home/bastiaan/gnash/libcore/movie_root.cpp:982
(libgnashcore-0.8.11dev.so+0x0000000dea4c)
#15 gnash::movie_root::advance()
/home/bastiaan/gnash/libcore/movie_root.cpp:933
(libgnashcore-0.8.11dev.so+0x0000000ee249)
#16 gnash::Gui::advanceMovie(bool) /home/bastiaan/gnash/gui/gui.cpp:954
(lt-gtk-gnash+0x00000004519b)
#17 gnash::Gui::advance_movie(gnash::Gui*)
/home/bastiaan/gnash/gui/gui.h:273 (lt-gtk-gnash+0x00000006b3ba)
#18 <null> <null>:0 (libglib-2.0.so.0+0x003e80849e42)
#19 gnash::Player::run(int, char**, std::string const&, std::string
const&) /home/bastiaan/gnash/gui/Player.cpp:664 (lt-gtk-gnash+0x000000053ae4)
#20 playFile(gnash::Player&, int, char**, std::string const&)
/home/bastiaan/gnash/gui/gnash.cpp:92 (lt-gtk-gnash+0x000000017a27)
#21 __call<void, std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, 0ul, 1ul, 2ul, 3ul>
/usr/include/c++/4.9.0/functional:1264 (lt-gtk-gnash+0x00000001bb40)
#22 operator()<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, void> /usr/include/c++/4.9.0/functional:1323
(lt-gtk-gnash+0x00000001bb40)
#23 for_each<__gnu_cxx::__normal_iterator<std::basic_string<char>*,
std::vector<std::basic_string<char> > >, std::_Bind<void
(*(std::reference_wrapper<gnash::Player>, int, char**,
std::_Placeholder<1>))(gnash::Player&, int, char**, const
std::basic_string<char>&)> > /usr/include/c++/4.9.0/bits/stl_algo.h:3755
(lt-gtk-gnash+0x00000001bb40)
#24 main /home/bastiaan/gnash/gui/gnash.cpp:176
(lt-gtk-gnash+0x00000001bb40)
SUMMARY: ThreadSanitizer: data race /usr/include/c++/4.9.0/bits/stl_tree.h:768
std::_Rb_tree<gnash::sound::InputStream*, gnash::sound::InputStream*,
std::_Identity<gnash::sound::InputStream*>,
std::less<gnash::sound::InputStream*>,
std::allocator<gnash::sound::InputStream*> >::empty() const
==================
It seems two threads are accessing sound_handler::_inputStreams at the same
time. sound_handler_sdl, from its own thread, is holding a mutex lock in
SDL_sound_handler::fetchSamples(), but the main thread does not hold a lock
when calling sound_handler::streamingSound().
_______________________________________________________
Reply to this item at:
<http://savannah.gnu.org/bugs/?42548>
_______________________________________________
Message sent via/by Savannah
http://savannah.gnu.org/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] [bug #42548] data race to sound_handler::_inputStreams,
Bastiaan Jacques <=