TSan reports a data race between content::MediaStreamAudioProcessor::ProcessData() and shutdown |
|||||||||||
Issue descriptionReport from https://build.chromium.org/p/chromium.memory.full/builders/Linux%20TSan%20Tests/builds/1646/steps/content_browsertests%20on%20Ubuntu-12.04/logs/stdio (previously reported in issue 638578 ): [ RUN ] WebRtcGetUserMediaBrowserTest.GetAudioAndVideoStreamAndClone [7837:7837:0915/022322:13288977894:WARNING:audio_manager.cc(317)] Multiple instances of AudioManager detected [7837:7837:0915/022322:13288978096:WARNING:audio_manager.cc(278)] Multiple instances of AudioManager detected Xlib: extension "RANDR" missing on display ":9". [7837:7837:0915/022323:13290032873:INFO:CONSOLE(169)] "Calling getUserMediaAndClone.", source: http://127.0.0.1:46906/media/getusermedia.html (169) [7837:7837:0915/022323:13290088280:INFO:CONSOLE(75)] "Looking at video in element local-view-1", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (75) [7837:7837:0915/022327:13293794779:INFO:CONSOLE(108)] "Still waiting for video to satisfy function isVideoPlaying(pixels, previousPixels) { for (var i = 0; i < pixels.length; i++) { if (pixels[i] != previousPixels[i]) { return true; } } return false; }", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (108) [7837:7837:0915/022327:13293795477:INFO:CONSOLE(109)] "DEBUG: video.width = 0", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (109) [7837:7837:0915/022327:13293796283:INFO:CONSOLE(110)] "DEBUG: video.height = 0", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (110) [7837:7837:0915/022327:13293914978:INFO:CONSOLE(98)] "Done looking at video in element local-view-1", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (98) [7837:7837:0915/022327:13293915807:INFO:CONSOLE(99)] "DEBUG: video.width = 640", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (99) [7837:7837:0915/022327:13293916086:INFO:CONSOLE(100)] "DEBUG: video.height = 480", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (100) [7837:7837:0915/022327:13293917151:INFO:CONSOLE(29)] "Test Success", source: http://127.0.0.1:46906/media/webrtc_test_utilities.js (29) ================== WARNING: ThreadSanitizer: data race (pid=7871) Read of size 8 at 0x7d48000002d0 by thread T10: #0 operator-> base/memory/ref_counted.h:323:12 (content_browsertests+0x000003f3032c) #1 content::MediaStreamAudioProcessor::ProcessData(float const* const*, int, base::TimeDelta, int, bool, float* const*) content/renderer/media/media_stream_audio_processor.cc:812 (content_browsertests+0x000003f3032c) #2 content::MediaStreamAudioProcessor::ProcessAndConsumeData(int, bool, media::AudioBus**, base::TimeDelta*, int*) content/renderer/media/media_stream_audio_processor.cc:375:19 (content_browsertests+0x000003f2fc83) #3 content::ProcessedLocalAudioSource::Capture(media::AudioBus const*, int, double, bool) content/renderer/media/webrtc/processed_local_audio_source.cc:321:28 (content_browsertests+0x000003e411ef) #4 non-virtual thunk to content::ProcessedLocalAudioSource::Capture(media::AudioBus const*, int, double, bool) content/renderer/media/webrtc/processed_local_audio_source.cc:266:33 (content_browsertests+0x000003e412a6) #5 media::AudioInputDevice::AudioThreadCallback::Process(unsigned int) media/audio/audio_input_device.cc:345:22 (content_browsertests+0x000000c49687) #6 media::AudioDeviceThread::ThreadMain() media/audio/audio_device_thread.cc:84:18 (content_browsertests+0x000000c4477a) #7 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (content_browsertests+0x000002a952cd) Previous write of size 8 at 0x7d48000002d0 by main thread: #0 swap base/memory/ref_counted.h:360:9 (content_browsertests+0x000002a47671) #1 swap base/memory/ref_counted.h:364 (content_browsertests+0x000002a47671) #2 operator= base/memory/ref_counted.h:347 (content_browsertests+0x000002a47671) #3 base::MessageLoop::SetTaskRunner(scoped_refptr<base::SingleThreadTaskRunner>) base/message_loop/message_loop.cc:436 (content_browsertests+0x000002a47671) #4 blink::scheduler::SchedulerTqmDelegateImpl::RestoreDefaultTaskRunner() third_party/WebKit/Source/platform/scheduler/child/scheduler_tqm_delegate_impl.cc:38:20 (content_browsertests+0x0000041235e6) #5 blink::scheduler::SchedulerHelper::Shutdown() third_party/WebKit/Source/platform/scheduler/child/scheduler_helper.cc:53:33 (content_browsertests+0x000004122e68) #6 blink::scheduler::RendererSchedulerImpl::Shutdown() third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc:203:11 (content_browsertests+0x00000408300f) #7 content::RenderThreadImpl::Shutdown() content/renderer/render_thread_impl.cc:962:24 (content_browsertests+0x000003d89f65) #8 non-virtual thunk to content::RenderThreadImpl::Shutdown() content/renderer/render_thread_impl.cc:859:24 (content_browsertests+0x000003d8a0cd) #9 content::ChildProcess::~ChildProcess() content/child/child_process.cc:73:19 (content_browsertests+0x000003c918c7) #10 content::RenderProcessImpl::~RenderProcessImpl() content/renderer/render_process_impl.cc:113:1 (content_browsertests+0x000003d837bf) #11 content::RendererMain(content::MainFunctionParams const&) content/renderer/renderer_main.cc:207:3 (content_browsertests+0x000003dcc4eb) #12 content::RunZygote(content::MainFunctionParams const&, content::ContentMainDelegate*) content/app/content_main_runner.cc:343:14 (content_browsertests+0x000001f05b4d) #13 content::RunNamedProcessTypeMain(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, content::MainFunctionParams const&, content::ContentMainDelegate*) content/app/content_main_runner.cc:426:12 (content_browsertests+0x000001f066d7) #14 content::ContentMainRunnerImpl::Run() content/app/content_main_runner.cc:786:12 (content_browsertests+0x000001f073ad) #15 content::ContentMain(content::ContentMainParams const&) content/app/content_main.cc:20:28 (content_browsertests+0x000001efe2ce) #16 content::LaunchTests(content::TestLauncherDelegate*, int, int, char**) content/public/test/test_launcher.cc:523:12 (content_browsertests+0x000002632c8a) #17 main content/test/content_test_launcher.cc:131:10 (content_browsertests+0x000002618802) Thread T10 'AudioInputDevic' (tid=7884, running) created by thread T1 at: #0 pthread_create <null> (content_browsertests+0x0000004b1c45) #1 base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:110:13 (content_browsertests+0x000002a94f97) #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:191:10 (content_browsertests+0x000002a94e95) #3 media::AudioDeviceThread::AudioDeviceThread(media::AudioDeviceThread::Callback*, int, char const*) media/audio/audio_device_thread.cc:51:3 (content_browsertests+0x000000c444d6) #4 media::AudioInputDevice::OnStreamCreated(base::FileDescriptor, int, int, int) media/audio/audio_input_device.cc:151:27 (content_browsertests+0x000000c486c2) #5 non-virtual thunk to media::AudioInputDevice::OnStreamCreated(base::FileDescriptor, int, int, int) media/audio/audio_input_device.cc:123:24 (content_browsertests+0x000000c4879d) #6 content::AudioInputMessageFilter::OnStreamCreated(int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int) content/renderer/media/audio_input_message_filter.cc:145:13 (content_browsertests+0x000003efccb7) #7 DispatchToMethodImpl<content::AudioInputMessageFilter *, void (content::AudioInputMessageFilter::*)(int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int), const std::__1::tuple<int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int> &, 0, 1, 2, 3, 4> base/tuple.h:144:3 (content_browsertests+0x000003efca1a) #8 DispatchToMethod<content::AudioInputMessageFilter *, void (content::AudioInputMessageFilter::*)(int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int), const std::__1::tuple<int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int> &> base/tuple.h:151 (content_browsertests+0x000003efca1a) #9 DispatchToMethod<content::AudioInputMessageFilter, void (content::AudioInputMessageFilter::*)(int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int), void, std::__1::tuple<int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int> > ipc/ipc_message_templates.h:26 (content_browsertests+0x000003efca1a) #10 bool IPC::MessageT<AudioInputMsg_NotifyStreamCreated_Meta, std::__1::tuple<int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int>, void>::Dispatch<content::AudioInputMessageFilter, content::AudioInputMessageFilter, void, void (content::AudioInputMessageFilter::*)(int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int)>(IPC::Message const*, content::AudioInputMessageFilter*, content::AudioInputMessageFilter*, void*, void (content::AudioInputMessageFilter::*)(int, base::FileDescriptor, base::FileDescriptor, unsigned int, unsigned int)) ipc/ipc_message_templates.h:121 (content_browsertests+0x000003efca1a) #11 content::AudioInputMessageFilter::OnMessageReceived(IPC::Message const&) content/renderer/media/audio_input_message_filter.cc:85:5 (content_browsertests+0x000003efc867) #12 TryFiltersImpl ipc/message_filter_router.cc:22:21 (content_browsertests+0x000002cf3920) #13 IPC::MessageFilterRouter::TryFilters(IPC::Message const&) ipc/message_filter_router.cc:80 (content_browsertests+0x000002cf3920) #14 IPC::ChannelProxy::Context::TryFilters(IPC::Message const&) ipc/ipc_channel_proxy.cc:103:31 (content_browsertests+0x000002cd951a) #15 IPC::SyncChannel::SyncContext::OnMessageReceived(IPC::Message const&) ipc/ipc_sync_channel.cc:428:7 (content_browsertests+0x000002cec534) #16 IPC::ChannelMojo::OnMessageReceived(IPC::Message const&) ipc/ipc_channel_mojo.cc:410:14 (content_browsertests+0x000002cd1069) #17 non-virtual thunk to IPC::ChannelMojo::OnMessageReceived(IPC::Message const&) ipc/ipc_channel_mojo.cc:402:19 (content_browsertests+0x000002cd1254) #18 IPC::internal::MessagePipeReader::Receive(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> > const&, base::Optional<std::__1::vector<mojo::StructPtr<IPC::mojom::SerializedHandle>, std::__1::allocator<mojo::StructPtr<IPC::mojom::SerializedHandle> > > >) ipc/ipc_message_pipe_reader.cc:113:14 (content_browsertests+0x000002ce1db7) #19 IPC::mojom::ChannelStub::Accept(mojo::Message*) out/Release/gen/ipc/ipc.mojom.cc:242:14 (content_browsertests+0x000000b2b59e) #20 mojo::InterfaceEndpointClient::HandleValidatedMessage(mojo::Message*) mojo/public/cpp/bindings/lib/interface_endpoint_client.cc:334:32 (content_browsertests+0x000002723ba6) #21 mojo::InterfaceEndpointClient::HandleIncomingMessageThunk::Accept(mojo::Message*) mojo/public/cpp/bindings/lib/interface_endpoint_client.cc:128:18 (content_browsertests+0x00000272391a) #22 mojo::FilterChain::Accept(mojo::Message*) mojo/public/cpp/bindings/lib/filter_chain.cc:40:17 (content_browsertests+0x00000272339d) #23 mojo::InterfaceEndpointClient::HandleIncomingMessage(mojo::Message*) mojo/public/cpp/bindings/lib/interface_endpoint_client.cc:268:19 (content_browsertests+0x000002724964) #24 IPC::(anonymous namespace)::ChannelAssociatedGroupController::Accept(mojo::Message*) ipc/ipc_mojo_bootstrap.cc:644:20 (content_browsertests+0x000002ce507a) #25 non-virtual thunk to IPC::(anonymous namespace)::ChannelAssociatedGroupController::Accept(mojo::Message*) ipc/ipc_mojo_bootstrap.cc:595:8 (content_browsertests+0x000002ce5694) #26 mojo::FilterChain::Accept(mojo::Message*) mojo/public/cpp/bindings/lib/filter_chain.cc:40:17 (content_browsertests+0x00000272339d) #27 mojo::Connector::ReadSingleMessage(unsigned int*) mojo/public/cpp/bindings/lib/connector.cc:276:51 (content_browsertests+0x000002721bd5) #28 ReadAllAvailableMessages mojo/public/cpp/bindings/lib/connector.cc:302:10 (content_browsertests+0x00000272208a) #29 OnHandleReadyInternal mojo/public/cpp/bindings/lib/connector.cc:234 (content_browsertests+0x00000272208a) #30 mojo::Connector::OnWatcherHandleReady(unsigned int) mojo/public/cpp/bindings/lib/connector.cc:214 (content_browsertests+0x00000272208a) #31 Invoke<mojo::Connector *, unsigned int> base/bind_internal.h:214:12 (content_browsertests+0x000002722254) #32 MakeItSo<void (mojo::Connector::*const &)(unsigned int), mojo::Connector *, unsigned int> base/bind_internal.h:285 (content_browsertests+0x000002722254) #33 RunImpl<void (mojo::Connector::*const &)(unsigned int), const std::__1::tuple<base::internal::UnretainedWrapper<mojo::Connector> > &, 0> base/bind_internal.h:361 (content_browsertests+0x000002722254) #34 base::internal::Invoker<base::internal::BindState<void (mojo::Connector::*)(unsigned int), base::internal::UnretainedWrapper<mojo::Connector> >, void (unsigned int)>::Run(base::internal::BindStateBase*, unsigned int&&) base/bind_internal.h:339 (content_browsertests+0x000002722254) #35 Run base/callback.h:64:12 (content_browsertests+0x000000b27cf9) #36 OnHandleReady mojo/public/cpp/system/watcher.cc:122 (content_browsertests+0x000000b27cf9) #37 mojo::Watcher::CallOnHandleReady(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int) mojo/public/cpp/system/watcher.cc:142 (content_browsertests+0x000000b27cf9) #38 mojo::edk::(anonymous namespace)::CallWatchCallback(void (*)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), unsigned long, unsigned int, mojo::edk::HandleSignalsState const&, unsigned int) mojo/edk/system/core.cc:57:3 (content_browsertests+0x0000026e918c) #39 Invoke<void (*const &)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), const unsigned long &, unsigned int, const mojo::edk::HandleSignalsState &, unsigned int> base/bind_internal.h:164:12 (content_browsertests+0x0000026ed87d) #40 MakeItSo<void (*const &)(void (*)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), unsigned long, unsigned int, const mojo::edk::HandleSignalsState &, unsigned int), void (*const &)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), const unsigned long &, unsigned int, const mojo::edk::HandleSignalsState &, unsigned int> base/bind_internal.h:285 (content_browsertests+0x0000026ed87d) #41 RunImpl<void (*const &)(void (*)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), unsigned long, unsigned int, const mojo::edk::HandleSignalsState &, unsigned int), const std::__1::tuple<void (*)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), unsigned long> &, 0, 1> base/bind_internal.h:361 (content_browsertests+0x0000026ed87d) #42 base::internal::Invoker<base::internal::BindState<void (*)(void (*)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), unsigned long, unsigned int, mojo::edk::HandleSignalsState const&, unsigned int), void (*)(unsigned long, unsigned int, MojoHandleSignalsState, unsigned int), unsigned long>, void (unsigned int, mojo::edk::HandleSignalsState const&, unsigned int)>::Run(base::internal::BindStateBase*, unsigned int&&, mojo::edk::HandleSignalsState const&, unsigned int&&) base/bind_internal.h:339 (content_browsertests+0x0000026ed87d) #43 Run base/callback.h:64:12 (content_browsertests+0x000002712db9) #44 mojo::edk::Watcher::MaybeInvokeCallback(unsigned int, mojo::edk::HandleSignalsState const&, unsigned int) mojo/edk/system/watcher.cc:24 (content_browsertests+0x000002712db9) #45 mojo::edk::RequestContext::~RequestContext() mojo/edk/system/request_context.cc:59:22 (content_browsertests+0x00000270a1e8) #46 mojo::edk::NodeChannel::OnChannelMessage(void const*, unsigned long, std::__1::unique_ptr<std::__1::vector<mojo::edk::PlatformHandle, std::__1::allocator<mojo::edk::PlatformHandle> >, mojo::edk::PlatformHandleVectorDeleter>) mojo/edk/system/node_channel.cc:766:1 (content_browsertests+0x00000271de40) #47 mojo::edk::Channel::OnReadComplete(unsigned long, unsigned long*) mojo/edk/system/channel.cc:563:18 (content_browsertests+0x0000027169db) #48 mojo::edk::(anonymous namespace)::ChannelPosix::OnFileCanReadWithoutBlocking(int) mojo/edk/system/channel_posix.cc:314:14 (content_browsertests+0x000002718ece) #49 non-virtual thunk to mojo::edk::(anonymous namespace)::ChannelPosix::OnFileCanReadWithoutBlocking(int) mojo/edk/system/channel_posix.cc:274:8 (content_browsertests+0x000002719134) #50 OnFileCanReadWithoutBlocking base/message_loop/message_pump_libevent.cc:95:13 (content_browsertests+0x000002a4d03a) #51 base::MessagePumpLibevent::OnLibeventNotification(int, short, void*) base/message_loop/message_pump_libevent.cc:344 (content_browsertests+0x000002a4d03a) #52 event_process_active base/third_party/libevent/event.c:381:4 (content_browsertests+0x000002aefbd1) #53 event_base_loop base/third_party/libevent/event.c:521 (content_browsertests+0x000002aefbd1) #54 base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) base/message_loop/message_pump_libevent.cc:244:7 (content_browsertests+0x000002a4d402) #55 base::MessageLoop::RunHandler() base/message_loop/message_loop.cc:451:10 (content_browsertests+0x000002a476eb) #56 base::RunLoop::Run() base/run_loop.cc:35:10 (content_browsertests+0x000002a70767) #57 base::Thread::Run(base::RunLoop*) base/threading/thread.cc:229:13 (content_browsertests+0x000002a9baa9) #58 base::Thread::ThreadMain() base/threading/thread.cc:307:3 (content_browsertests+0x000002a9bcd5) #59 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (content_browsertests+0x000002a952cd) SUMMARY: ThreadSanitizer: data race base/memory/ref_counted.h:323:12 in operator-> ================== Received signal 11 SEGV_MAPERR 000000000000 #0 0x0000004ca806 [7871:7873:0915/022327:13294328215:ERROR:audio_input_device.cc(271)] IO loop going away before the input device has been stopped __interceptor_backtrace
,
Oct 7 2016
A friendly ping.
,
Oct 17 2016
Ping.
,
Oct 19 2016
I think this is being caused by MSAudioProcessor storing a raw pointer to the MessageLoop and assuming that will always be valid (and thread-safe to access). It's not. Instead, it should store a refptr to a TaskRunner, which is the normal mechanism for mitigating these kinds of "post task during shutdown" issues.
,
Oct 19 2016
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/a4717b9caba5b1fb1e4455af8932a3a870a9aecf commit a4717b9caba5b1fb1e4455af8932a3a870a9aecf Author: miu <miu@chromium.org> Date: Wed Oct 19 23:04:11 2016 Data race fix: Replace use of MessageLoop raw pointer in MSAudioProcessor. This change replaces the use of a raw pointer to the main thread's MessageLoop, by content::MediaStreamAudioProcessor, with a scoped_refptr to the main thread's task runner. This fixes a TSan-reported shutdown data race which was caused by the MessageLoop releasing its task runner at the same time the audio thread was using the MessageLoop::task_runner() accessor method. BUG= 647178 Review-Url: https://chromiumcodereview.appspot.com/2425353002 Cr-Commit-Position: refs/heads/master@{#426318} [modify] https://crrev.com/a4717b9caba5b1fb1e4455af8932a3a870a9aecf/content/renderer/media/media_stream_audio_processor.cc [modify] https://crrev.com/a4717b9caba5b1fb1e4455af8932a3a870a9aecf/content/renderer/media/media_stream_audio_processor.h [modify] https://crrev.com/a4717b9caba5b1fb1e4455af8932a3a870a9aecf/content/renderer/media/media_stream_audio_processor_unittest.cc [modify] https://crrev.com/a4717b9caba5b1fb1e4455af8932a3a870a9aecf/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc
,
Oct 22 2016
,
Oct 22 2016
,
Oct 24 2016
[Automated comment] There appears to be on-going work (i.e. bugroid changes), needs manual review.
,
Oct 24 2016
Before we approve merge to M55 branch 2883, could you please confirm whether this change is baked/verified in Canary and safe to merge to M55?
,
Oct 24 2016
,
Oct 24 2016
Your change meets the bar and is auto-approved for M55 (branch: 2883)
,
Oct 24 2016
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/6f8fc5767534da6ea3682ab3bde09e782909467b commit 6f8fc5767534da6ea3682ab3bde09e782909467b Author: Yuri Wiitala <miu@chromium.org> Date: Mon Oct 24 21:42:42 2016 Data race fix: Replace use of MessageLoop raw pointer in MSAudioProcessor. This change replaces the use of a raw pointer to the main thread's MessageLoop, by content::MediaStreamAudioProcessor, with a scoped_refptr to the main thread's task runner. This fixes a TSan-reported shutdown data race which was caused by the MessageLoop releasing its task runner at the same time the audio thread was using the MessageLoop::task_runner() accessor method. BUG= 647178 Review-Url: https://chromiumcodereview.appspot.com/2425353002 Cr-Commit-Position: refs/heads/master@{#426318} (cherry picked from commit a4717b9caba5b1fb1e4455af8932a3a870a9aecf) Review URL: https://codereview.chromium.org/2449573003 . Cr-Commit-Position: refs/branch-heads/2883@{#263} Cr-Branched-From: 614d31daee2f61b0180df403a8ad43f20b9f6dd7-refs/heads/master@{#423768} [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/media_stream_audio_processor.cc [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/media_stream_audio_processor.h [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/media_stream_audio_processor_unittest.cc [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc
,
Oct 27 2016
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/6f8fc5767534da6ea3682ab3bde09e782909467b commit 6f8fc5767534da6ea3682ab3bde09e782909467b Author: Yuri Wiitala <miu@chromium.org> Date: Mon Oct 24 21:42:42 2016 Data race fix: Replace use of MessageLoop raw pointer in MSAudioProcessor. This change replaces the use of a raw pointer to the main thread's MessageLoop, by content::MediaStreamAudioProcessor, with a scoped_refptr to the main thread's task runner. This fixes a TSan-reported shutdown data race which was caused by the MessageLoop releasing its task runner at the same time the audio thread was using the MessageLoop::task_runner() accessor method. BUG= 647178 Review-Url: https://chromiumcodereview.appspot.com/2425353002 Cr-Commit-Position: refs/heads/master@{#426318} (cherry picked from commit a4717b9caba5b1fb1e4455af8932a3a870a9aecf) Review URL: https://codereview.chromium.org/2449573003 . Cr-Commit-Position: refs/branch-heads/2883@{#263} Cr-Branched-From: 614d31daee2f61b0180df403a8ad43f20b9f6dd7-refs/heads/master@{#423768} [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/media_stream_audio_processor.cc [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/media_stream_audio_processor.h [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/media_stream_audio_processor_unittest.cc [modify] https://crrev.com/6f8fc5767534da6ea3682ab3bde09e782909467b/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc
,
Nov 4 2016
[Automated comment] removing mislabelled merge-merged-2840 |
|||||||||||
►
Sign in to add a comment |
|||||||||||
Comment 1 by mcasas@chromium.org
, Sep 16 2016