[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] [bug #42551] Data race for MediaParser::_audioFrames
From: |
Bastiaan Jacques |
Subject: |
[Gnash-commit] [bug #42551] Data race for MediaParser::_audioFrames |
Date: |
Fri, 13 Jun 2014 14:53:34 +0000 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0 |
URL:
<http://savannah.gnu.org/bugs/?42551>
Summary: Data race for MediaParser::_audioFrames
Project: Gnash - The GNU Flash player
Submitted by: bjacques
Submitted on: Fri 13 Jun 2014 04:53:33 PM CEST
Category: None
Severity: 4 - Important
Release: None
Status: None
Privacy: Public
Assigned to: None
Open/Closed: Open
Discussion Lock: Any
_______________________________________________________
Details:
Thread Sanitizer reports, when running actionscript.all/Video-v5.swf:
==================
WARNING: ThreadSanitizer: data race (pid=3827)
Write of size 8 at 0x7d500000e410 by main thread (mutexes: write M2191):
#0 std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >::release()
/usr/include/c++/4.9.0/bits/unique_ptr.h:328 (libgn
ashmedia-0.8.11dev.so+0x000000032b77)
#1 std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame>
>::operator=(std::unique_ptr<gnash::media::EncodedAudioFrame, st
d::default_delete<gnash::media::EncodedAudioFrame> >&&)
/usr/include/c++/4.9.0/bits/unique_ptr.h:251
(libgnashmedia-0.8.11dev.so+0x000000032b77)
#2 gnash::media::MediaParser::nextAudioFrame()
/home/bastiaan/gnash/libmedia/MediaParser.cpp:233
(libgnashmedia-0.8.11dev.so+0x000000032b77)
#3 gnash::NetStream_as::decodeNextAudioFrame()
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:673
(libgnashcore-0.8.11dev.so+0x0000002536eb)
#4 gnash::NetStream_as::pushDecodedAudioFrames(unsigned int)
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:1008
(libgnashcore-0.8.11dev.so+0x00000025b4fb)
#5 gnash::NetStream_as::refreshAudioBuffer()
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:827
(libgnashcore-0.8.11dev.so+0x00000025b86b)
#6 gnash::NetStream_as::update()
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:1318
(libgnashcore-0.8.11dev.so+0x00000025ba60)
#7 operator() /home/bastiaan/gnash/libcore/movie_root.cpp:108
(libgnashcore-0.8.11dev.so+0x0000000ed687)
#8 for_each<__gnu_cxx::__normal_iterator<gnash::as_object**,
std::vector<gnash::as_object*> >, gnash::(anonymous
namespace)::ExecuteCallback> /usr/include/c++/4.9.0/bits/stl_algo.h:3755
(libgnashcore-0.8.11dev.so+0x0000000ed687)
#9 gnash::movie_root::executeAdvanceCallbacks()
/home/bastiaan/gnash/libcore/movie_root.cpp:1543
(libgnashcore-0.8.11dev.so+0x0000000ed687)
#10 gnash::movie_root::advance()
/home/bastiaan/gnash/libcore/movie_root.cpp:941
(libgnashcore-0.8.11dev.so+0x0000000ee273)
#11 gnash::movie_root::processActionQueue()
/home/bastiaan/gnash/libcore/movie_root.cpp:1481
(libgnashcore-0.8.11dev.so+0x0000000dd279)
#12 gnash::movie_root::advanceMovie()
/home/bastiaan/gnash/libcore/movie_root.cpp:982
(libgnashcore-0.8.11dev.so+0x0000000dea4c)
#13 gnash::movie_root::advance()
/home/bastiaan/gnash/libcore/movie_root.cpp:933
(libgnashcore-0.8.11dev.so+0x0000000ee249)
#14 play_movie /home/bastiaan/gnash/utilities/processor.cpp:532
(lt-gprocessor+0x000000009757)
#15 main /home/bastiaan/gnash/utilities/processor.cpp:376
(lt-gprocessor+0x00000000b0e0)
Previous read of size 8 at 0x7d500000e410 by thread T3:
#0 std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >::get() const
/usr/include/c++/4.9.0/bits/unique_ptr.h:305
(libgnashmedia-0.8.11dev.so+0x0000000323fc)
#1 std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >::operator->() const
/usr/include/c++/4.9.0/bits/unique_ptr.h:299
(libgnashmedia-0.8.11dev.so+0x0000000323fc)
#2 gnash::media::MediaParser::audioBufferLength() const
/home/bastiaan/gnash/libmedia/MediaParser.cpp:124
(libgnashmedia-0.8.11dev.so+0x0000000323fc)
#3 gnash::media::MediaParser::getBufferLengthNoLock() const
/home/bastiaan/gnash/libmedia/MediaParser.cpp:93
(libgnashmedia-0.8.11dev.so+0x000000032477)
#4 gnash::media::MediaParser::bufferFull() const
/home/bastiaan/gnash/libmedia/MediaParser.cpp:399
(libgnashmedia-0.8.11dev.so+0x000000033004)
#5 gnash::media::FLVParser::parseNextChunk()
/home/bastiaan/gnash/libmedia/FLVParser.cpp:125
(libgnashmedia-0.8.11dev.so+0x0000000264c0)
#6 gnash::media::MediaParser::parserLoop()
/home/bastiaan/gnash/libmedia/MediaParser.cpp:412
(libgnashmedia-0.8.11dev.so+0x00000003345e)
#7 operator()<, void> /usr/include/c++/4.9.0/functional:569
(libgnashmedia-0.8.11dev.so+0x0000000365f3)
#8 _M_invoke<0ul> /usr/include/c++/4.9.0/functional:1700
(libgnashmedia-0.8.11dev.so+0x0000000365f3)
#9 std::_Bind_simple<std::_Mem_fn<void (gnash::media::MediaParser::*)()>
(gnash::media::MediaParser*)>::operator()()
/usr/include/c++/4.9.0/functional:1688
(libgnashmedia-0.8.11dev.so+0x0000000365f3)
#10 std::thread::_Impl<std::_Bind_simple<std::_Mem_fn<void
(gnash::media::MediaParser::*)()> (gnash::media::MediaParser*)> >::_M_run()
/usr/include/c++/4.9.0/thread:115 (libgnashmedia-0.8.11dev.so+0x0000000365f3)
#11 <null> <null>:0 (libstdc++.so.6+0x003af5ebae5f)
Location is heap block of size 512 at 0x7d500000e400 allocated by main
thread:
#0 operator new(unsigned long) <null>:0 (libtsan.so.0+0x00000004cb42)
#1
__gnu_cxx::new_allocator<std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> > >::allocate(unsigned
long, void const*) /usr/include/c++/4.9.0/ext/new_allocator.h:104
(libgnashmedia-0.8.11dev.so+0x000000033ae0)
#2 std::_Deque_base<std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >,
std::allocator<std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> > > >::_M_allocate_node()
/usr/include/c++/4.9.0/bits/stl_deque.h:538
(libgnashmedia-0.8.11dev.so+0x000000033ae0)
#3 std::_Deque_base<std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >,
std::allocator<std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> > >
>::_M_create_nodes(std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >**,
std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >**)
/usr/include/c++/4.9.0/bits/stl_deque.h:632
(libgnashmedia-0.8.11dev.so+0x000000033ae0)
#4 std::_Deque_base<std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >,
std::allocator<std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> > >
>::_M_initialize_map(unsigned long)
/usr/include/c++/4.9.0/bits/stl_deque.h:606
(libgnashmedia-0.8.11dev.so+0x000000033ae0)
#5 _Deque_base /usr/include/c++/4.9.0/bits/stl_deque.h:458
(libgnashmedia-0.8.11dev.so+0x000000033ae0)
#6 deque /usr/include/c++/4.9.0/bits/stl_deque.h:788
(libgnashmedia-0.8.11dev.so+0x000000033ae0)
#7
gnash::media::MediaParser::MediaParser(std::unique_ptr<gnash::IOChannel,
std::default_delete<gnash::IOChannel> >)
/home/bastiaan/gnash/libmedia/MediaParser.cpp:44
(libgnashmedia-0.8.11dev.so+0x000000033ae0)
#8 gnash::media::FLVParser::FLVParser(std::unique_ptr<gnash::IOChannel,
std::default_delete<gnash::IOChannel> >)
/home/bastiaan/gnash/libmedia/FLVParser.cpp:52
(libgnashmedia-0.8.11dev.so+0x0000000246ee)
#9
gnash::media::ffmpeg::MediaHandlerFfmpeg::createMediaParser(std::unique_ptr<gnash::IOChannel,
std::default_delete<gnash::IOChannel> >)
/home/bastiaan/gnash/libmedia/ffmpeg/MediaHandlerFfmpeg.cpp:60
(libgnashmedia-0.8.11dev.so+0x000000067e1b)
#10 gnash::NetStream_as::startPlayback()
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:503
(libgnashcore-0.8.11dev.so+0x0000002568c7)
#11 gnash::NetStream_as::play(std::string const&)
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:403
(libgnashcore-0.8.11dev.so+0x000000258e7e)
#12 netstream_play
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:1656
(libgnashcore-0.8.11dev.so+0x000000259251)
#13 gnash::builtin_function::call(gnash::fn_call const&)
/home/bastiaan/gnash/libcore/builtin_function.h:74
(libgnashcore-0.8.11dev.so+0x0000001e9ff7)
#14 ActionCallMethod /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:2810
(libgnashcore-0.8.11dev.so+0x000000344312)
#15 gnash::SWF::ActionHandler::execute(gnash::ActionExec&) const
/home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:238
(libgnashcore-0.8.11dev.so+0x00000032f469)
#16 gnash::SWF::SWFHandlers::execute(gnash::SWF::ActionType,
gnash::ActionExec&) const /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:431
(libgnashcore-0.8.11dev.so+0x000000347239)
#17 gnash::ActionExec::operator()()
/home/bastiaan/gnash/libcore/vm/ActionExec.cpp:258
(libgnashcore-0.8.11dev.so+0x00000034fba0)
#18 gnash::SWF::ActionHandler::execute(gnash::ActionExec&) const
/home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:238
(libgnashcore-0.8.11dev.so+0x00000032f469)
#19 gnash::SWF::SWFHandlers::execute(gnash::SWF::ActionType,
gnash::ActionExec&) const /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:431
(libgnashcore-0.8.11dev.so+0x000000347239)
#20 gnash::ActionExec::operator()()
/home/bastiaan/gnash/libcore/vm/ActionExec.cpp:258
(libgnashcore-0.8.11dev.so+0x00000034fba0)
#21 gnash::GlobalCode::execute()
/home/bastiaan/gnash/libcore/vm/ExecutableCode.h:75
(libgnashcore-0.8.11dev.so+0x0000000f0750)
#22 gnash::movie_root::processActionQueue(unsigned long)
/home/bastiaan/gnash/libcore/movie_root.cpp:1403
(libgnashcore-0.8.11dev.so+0x0000000dcfd3)
#23 gnash::movie_root::processActionQueue()
/home/bastiaan/gnash/libcore/movie_root.cpp:1481
(libgnashcore-0.8.11dev.so+0x0000000dd279)
#24 gnash::movie_root::advanceMovie()
/home/bastiaan/gnash/libcore/movie_root.cpp:982
(libgnashcore-0.8.11dev.so+0x0000000dea4c)
#25 gnash::movie_root::advance()
/home/bastiaan/gnash/libcore/movie_root.cpp:933
(libgnashcore-0.8.11dev.so+0x0000000ee249)
#26 play_movie /home/bastiaan/gnash/utilities/processor.cpp:532
(lt-gprocessor+0x000000009757)
#27 main /home/bastiaan/gnash/utilities/processor.cpp:376
(lt-gprocessor+0x00000000b0e0)
Mutex M2191 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
(libgnashmedia-0.8.11dev.so+0x0000000334c4)
#2 std::mutex::lock() /usr/include/c++/4.9.0/mutex:134
(libgnashmedia-0.8.11dev.so+0x0000000334c4)
#3 std::unique_lock<std::mutex>::lock() /usr/include/c++/4.9.0/mutex:473
(libgnashmedia-0.8.11dev.so+0x0000000334c4)
#4 unique_lock /usr/include/c++/4.9.0/mutex:405
(libgnashmedia-0.8.11dev.so+0x0000000334c4)
#5 gnash::media::MediaParser::parserLoop()
/home/bastiaan/gnash/libmedia/MediaParser.cpp:419
(libgnashmedia-0.8.11dev.so+0x0000000334c4)
#6 operator()<, void> /usr/include/c++/4.9.0/functional:569
(libgnashmedia-0.8.11dev.so+0x0000000365f3)
#7 _M_invoke<0ul> /usr/include/c++/4.9.0/functional:1700
(libgnashmedia-0.8.11dev.so+0x0000000365f3)
#8 std::_Bind_simple<std::_Mem_fn<void (gnash::media::MediaParser::*)()>
(gnash::media::MediaParser*)>::operator()()
/usr/include/c++/4.9.0/functional:1688
(libgnashmedia-0.8.11dev.so+0x0000000365f3)
#9 std::thread::_Impl<std::_Bind_simple<std::_Mem_fn<void
(gnash::media::MediaParser::*)()> (gnash::media::MediaParser*)> >::_M_run()
/usr/include/c++/4.9.0/thread:115 (libgnashmedia-0.8.11dev.so+0x0000000365f3)
#10 <null> <null>:0 (libstdc++.so.6+0x003af5ebae5f)
Thread T3 (tid=3844, running) created by main thread at:
#0 pthread_create <null>:0 (libtsan.so.0+0x00000004ac26)
#1 std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>)
<null>:0 (libstdc++.so.6+0x003af5ebaf88)
#2 gnash::media::FLVParser::FLVParser(std::unique_ptr<gnash::IOChannel,
std::default_delete<gnash::IOChannel> >)
/home/bastiaan/gnash/libmedia/FLVParser.cpp:58
(libgnashmedia-0.8.11dev.so+0x0000000248f9)
#3
gnash::media::ffmpeg::MediaHandlerFfmpeg::createMediaParser(std::unique_ptr<gnash::IOChannel,
std::default_delete<gnash::IOChannel> >)
/home/bastiaan/gnash/libmedia/ffmpeg/MediaHandlerFfmpeg.cpp:60
(libgnashmedia-0.8.11dev.so+0x000000067e1b)
#4 gnash::NetStream_as::startPlayback()
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:503
(libgnashcore-0.8.11dev.so+0x0000002568c7)
#5 gnash::NetStream_as::play(std::string const&)
/home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:403
(libgnashcore-0.8.11dev.so+0x000000258e7e)
#6 netstream_play /home/bastiaan/gnash/libcore/asobj/NetStream_as.cpp:1656
(libgnashcore-0.8.11dev.so+0x000000259251)
#7 gnash::builtin_function::call(gnash::fn_call const&)
/home/bastiaan/gnash/libcore/builtin_function.h:74
(libgnashcore-0.8.11dev.so+0x0000001e9ff7)
#8 ActionCallMethod /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:2810
(libgnashcore-0.8.11dev.so+0x000000344312)
#9 gnash::SWF::ActionHandler::execute(gnash::ActionExec&) const
/home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:238
(libgnashcore-0.8.11dev.so+0x00000032f469)
#10 gnash::SWF::SWFHandlers::execute(gnash::SWF::ActionType,
gnash::ActionExec&) const /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:431
(libgnashcore-0.8.11dev.so+0x000000347239)
#11 gnash::ActionExec::operator()()
/home/bastiaan/gnash/libcore/vm/ActionExec.cpp:258
(libgnashcore-0.8.11dev.so+0x00000034fba0)
#12 gnash::SWF::ActionHandler::execute(gnash::ActionExec&) const
/home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:238
(libgnashcore-0.8.11dev.so+0x00000032f469)
#13 gnash::SWF::SWFHandlers::execute(gnash::SWF::ActionType,
gnash::ActionExec&) const /home/bastiaan/gnash/libcore/vm/ASHandlers.cpp:431
(libgnashcore-0.8.11dev.so+0x000000347239)
#14 gnash::ActionExec::operator()()
/home/bastiaan/gnash/libcore/vm/ActionExec.cpp:258
(libgnashcore-0.8.11dev.so+0x00000034fba0)
#15 gnash::GlobalCode::execute()
/home/bastiaan/gnash/libcore/vm/ExecutableCode.h:75
(libgnashcore-0.8.11dev.so+0x0000000f0750)
#16 gnash::movie_root::processActionQueue(unsigned long)
/home/bastiaan/gnash/libcore/movie_root.cpp:1403
(libgnashcore-0.8.11dev.so+0x0000000dcfd3)
#17 gnash::movie_root::processActionQueue()
/home/bastiaan/gnash/libcore/movie_root.cpp:1481
(libgnashcore-0.8.11dev.so+0x0000000dd279)
#18 gnash::movie_root::advanceMovie()
/home/bastiaan/gnash/libcore/movie_root.cpp:982
(libgnashcore-0.8.11dev.so+0x0000000dea4c)
#19 gnash::movie_root::advance()
/home/bastiaan/gnash/libcore/movie_root.cpp:933
(libgnashcore-0.8.11dev.so+0x0000000ee249)
#21 main /home/bastiaan/gnash/utilities/processor.cpp:376
(lt-gprocessor+0x00000000b0e0)
SUMMARY: ThreadSanitizer: data race
/usr/include/c++/4.9.0/bits/unique_ptr.h:328
std::unique_ptr<gnash::media::EncodedAudioFrame,
std::default_delete<gnash::media::EncodedAudioFrame> >::release()
MediaParser::audioBufferLength() does not hold a lock. But this seems to be by
design, as this function is called from MediaParser::getBufferLengthNoLock().
The problem seems to originate in FLVParser, at the following line:
bool indexOnly = bufferFull(); // won't lock, but our caller locked...
So the comment seems to be incorrect.
_______________________________________________________
Reply to this item at:
<http://savannah.gnu.org/bugs/?42551>
_______________________________________________
Message sent via/by Savannah
http://savannah.gnu.org/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] [bug #42551] Data race for MediaParser::_audioFrames,
Bastiaan Jacques <=