Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Issue 1901583005: Revert of Pass task runners to AudioManager constructor. (Closed)

Created:
4 years, 8 months ago by Jeffrey Yasskin
Modified:
4 years, 8 months ago
CC:
chromium-reviews, feature-media-reviews_chromium.org, miu+watch_chromium.org
Base URL:
https://chromium.googlesource.com/chromium/src.git@master
Target Ref:
refs/pending/heads/master
Project:
chromium
Visibility:
Public.

Description

Revert of Pass task runners to AudioManager constructor. (patchset #50 id:980001 of https://codereview.chromium.org/1806313003/ ) Reason for revert: Broke TSan: https://build.chromium.org/p/chromium.memory.fyi/builders/Linux%20TSan%20Tests/builds/19362 WARNING: ThreadSanitizer: data race (pid=25863) Write of size 8 at 0x0000081b8060 by main thread: #0 media::AudioManagerDeleter::operator()(media::AudioManager const*) const media/audio/audio_manager.cc:264:20 (content_browsertests+0x000001e77078) #1 reset buildtools/third_party/libc++/trunk/include/memory:2735:13 (content_browsertests+0x000004e5f2af) #2 ~unique_ptr buildtools/third_party/libc++/trunk/include/memory:2703 (content_browsertests+0x000004e5f2af) #3 content::BrowserMainLoop::~BrowserMainLoop() content/browser/browser_main_loop.cc:428 (content_browsertests+0x000004e5f2af) #4 content::BrowserMainLoop::~BrowserMainLoop() content/browser/browser_main_loop.cc:424:37 (content_browsertests+0x000004e5f779) #5 operator() buildtools/third_party/libc++/trunk/include/memory:2529:13 (content_browsertests+0x000004e68120) #6 reset buildtools/third_party/libc++/trunk/include/memory:2735 (content_browsertests+0x000004e68120) #7 content::BrowserMainRunnerImpl::Shutdown() content/browser/browser_main_runner.cc:223 (content_browsertests+0x000004e68120) #8 ShellBrowserMain(content::MainFunctionParams const&, std::__1::unique_ptr<content::BrowserMainRunner, std::__1::default_delete<content::BrowserMainRunner> > const&) content/shell/browser/shell_browser_main.cc:33:3 (content_browsertests+0x000000c97ce7) #9 content::ShellMainDelegate::RunProcess(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, content::MainFunctionParams const&) content/shell/app/shell_main_delegate.cc:288:16 (content_browsertests+0x000000c8bec4) #10 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:368:25 (content_browsertests+0x000005558812) #11 content::ContentMainRunnerImpl::Run() content/app/content_main_runner.cc:742:12 (content_browsertests+0x000005559511) #12 content::ContentMain(content::ContentMainParams const&) content/app/content_main.cc:20:15 (content_browsertests+0x00000555797e) #13 content::BrowserTestBase::SetUp() content/public/test/browser_test_base.cc:287:3 (content_browsertests+0x000000c55601) #14 content::ContentBrowserTest::SetUp() content/public/test/content_browser_test.cc:92:3 (content_browsertests+0x000000c5e8e6) #15 SetUp content/browser/renderer_host/render_widget_host_view_browsertest.cc:221:5 (content_browsertests+0x000000739618) #16 content::(anonymous namespace)::CompositingRenderWidgetHostViewBrowserTestTabCapture::SetUp() content/browser/renderer_host/render_widget_host_view_browsertest.cc:403 (content_browsertests+0x000000739618) #17 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (content_browsertests+0x000000f3168d) #18 testing::Test::Run() testing/gtest/src/gtest.cc:2470 (content_browsertests+0x000000f3168d) #19 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:5 (content_browsertests+0x000000f32833) #20 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:5 (content_browsertests+0x000000f33118) #21 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:11 (content_browsertests+0x000000f3c562) #22 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (content_browsertests+0x000000f3bfc6) #23 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (content_browsertests+0x000000f3bfc6) #24 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:10 (content_browsertests+0x000000d209eb) #25 base::TestSuite::Run() base/test/test_suite.cc:230 (content_browsertests+0x000000d209eb) #26 content::ContentTestLauncherDelegate::RunTestSuite(int, char**) content/test/content_test_launcher.cc:105:12 (content_browsertests+0x000000c677db) #27 content::LaunchTests(content::TestLauncherDelegate*, int, int, char**) content/public/test/test_launcher.cc:517:12 (content_browsertests+0x000000cfb2fc) #28 main content/test/content_test_launcher.cc:131:10 (content_browsertests+0x000000c67762) Previous read of size 8 at 0x0000081b8060 by thread T15: #0 media::(anonymous namespace)::AudioManagerHelper::UpdateLastAudioThreadTimeTick() media/audio/audio_manager.cc:179:5 (content_browsertests+0x000001e77986) #1 Run<> base/bind_internal.h:181:12 (content_browsertests+0x000001e77df2) #2 MakeItSo<media::(anonymous namespace)::AudioManagerHelper *> base/bind_internal.h:321 (content_browsertests+0x000001e77df2) #3 base::internal::Invoker<base::IndexSequence<0ul>, base::internal::BindState<base::internal::RunnableAdapter<void (media::(anonymous namespace)::AudioManagerHelper::*)()>, void (media::(anonymous namespace)::AudioManagerHelper*), base::internal::UnretainedWrapper<media::(anonymous namespace)::AudioManagerHelper> >, base::internal::InvokeHelper<false, void, base::internal::RunnableAdapter<void (media::(anonymous namespace)::AudioManagerHelper::*)()> >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:372 (content_browsertests+0x000001e77df2) #4 Run base/callback.h:397:12 (content_browsertests+0x00000111aa7d) #5 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask const&) base/debug/task_annotator.cc:51 (content_browsertests+0x00000111aa7d) #6 base::MessageLoop::RunTask(base::PendingTask const&) base/message_loop/message_loop.cc:479:3 (content_browsertests+0x0000010958e6) #7 base::MessageLoop::DeferOrRunPendingTask(base::PendingTask const&) base/message_loop/message_loop.cc:488:5 (content_browsertests+0x000001095ecd) #8 base::MessageLoop::DoDelayedWork(base::TimeTicks*) base/message_loop/message_loop.cc:638:10 (content_browsertests+0x00000109662a) #9 base::MessagePumpDefault::Run(base::MessagePump::Delegate*) base/message_loop/message_pump_default.cc:37:17 (content_browsertests+0x000001099875) #10 base::MessageLoop::RunHandler() base/message_loop/message_loop.cc:443:3 (content_browsertests+0x00000109528b) #11 base::RunLoop::Run() base/run_loop.cc:35:3 (content_browsertests+0x0000010b5cc6) #12 base::MessageLoop::Run() base/message_loop/message_loop.cc:295:3 (content_browsertests+0x000001094a95) #13 base::Thread::Run(base::MessageLoop*) base/threading/thread.cc:202:3 (content_browsertests+0x0000010de279) #14 base::Thread::ThreadMain() base/threading/thread.cc:254:3 (content_browsertests+0x0000010de449) #15 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:70:3 (content_browsertests+0x0000010d88bd) Location is global 'media::(anonymous namespace)::g_last_created' of size 8 at 0x0000081b8060 (content_browsertests+0x0000081b8060) Thread T15 'AudioThread' (tid=25884, running) created by main thread at: #0 pthread_create <null> (content_browsertests+0x0000004a15c5) #1 base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:109:13 (content_browsertests+0x0000010d860a) #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:190:10 (content_browsertests+0x0000010d8515) #3 base::Thread::StartWithOptions(base::Thread::Options const&) base/threading/thread.cc:116:10 (content_browsertests+0x0000010ddfa0) #4 base::Thread::Start() base/threading/thread.cc:86:10 (content_browsertests+0x0000010ddde4) #5 content::BrowserMainLoop::CreateAudioManager() content/browser/browser_main_loop.cc:1468:3 (content_browsertests+0x000004e665c6) #6 content::BrowserMainLoop::BrowserThreadsStarted() content/browser/browser_main_loop.cc:1228:5 (content_browsertests+0x000004e633b5) #7 Run<> base/bind_internal.h:181:12 (content_browsertests+0x000004e67612) #8 MakeItSo<content::BrowserMainLoop *> base/bind_internal.h:313 (content_browsertests+0x000004e67612) #9 base::internal::Invoker<base::IndexSequence<0ul>, base::internal::BindState<base::internal::RunnableAdapter<int (content::BrowserMainLoop::*)()>, int (content::BrowserMainLoop*), base::internal::UnretainedWrapper<content::BrowserMainLoop> >, base::internal::InvokeHelper<false, int, base::internal::RunnableAdapter<int (content::BrowserMainLoop::*)()> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:372 (content_browsertests+0x000004e67612) #10 Run base/callback.h:397:12 (content_browsertests+0x0000050dd941) #11 content::StartupTaskRunner::RunAllTasksNow() content/browser/startup_task_runner.cc:45 (content_browsertests+0x0000050dd941) #12 content::BrowserMainLoop::CreateStartupTasks() content/browser/browser_main_loop.cc:803:3 (content_browsertests+0x000004e622db) #13 content::BrowserMainRunnerImpl::Initialize(content::MainFunctionParams const&) content/browser/browser_main_runner.cc:139:5 (content_browsertests+0x000004e67c63) #14 ShellBrowserMain(content::MainFunctionParams const&, std::__1::unique_ptr<content::BrowserMainRunner, std::__1::default_delete<content::BrowserMainRunner> > const&) content/shell/browser/shell_browser_main.cc:23:19 (content_browsertests+0x000000c97ca7) #15 content::ShellMainDelegate::RunProcess(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, content::MainFunctionParams const&) content/shell/app/shell_main_delegate.cc:288:16 (content_browsertests+0x000000c8bec4) #16 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:368:25 (content_browsertests+0x000005558812) #17 content::ContentMainRunnerImpl::Run() content/app/content_main_runner.cc:742:12 (content_browsertests+0x000005559511) #18 content::ContentMain(content::ContentMainParams const&) content/app/content_main.cc:20:15 (content_browsertests+0x00000555797e) #19 content::BrowserTestBase::SetUp() content/public/test/browser_test_base.cc:287:3 (content_browsertests+0x000000c55601) #20 content::ContentBrowserTest::SetUp() content/public/test/content_browser_test.cc:92:3 (content_browsertests+0x000000c5e8e6) #21 SetUp content/browser/renderer_host/render_widget_host_view_browsertest.cc:221:5 (content_browsertests+0x000000739618) #22 content::(anonymous namespace)::CompositingRenderWidgetHostViewBrowserTestTabCapture::SetUp() content/browser/renderer_host/render_widget_host_view_browsertest.cc:403 (content_browsertests+0x000000739618) #23 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (content_browsertests+0x000000f3168d) #24 testing::Test::Run() testing/gtest/src/gtest.cc:2470 (content_browsertests+0x000000f3168d) #25 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:5 (content_browsertests+0x000000f32833) #26 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:5 (content_browsertests+0x000000f33118) #27 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:11 (content_browsertests+0x000000f3c562) #28 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (content_browsertests+0x000000f3bfc6) #29 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (content_browsertests+0x000000f3bfc6) #30 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:10 (content_browsertests+0x000000d209eb) #31 base::TestSuite::Run() base/test/test_suite.cc:230 (content_browsertests+0x000000d209eb) #32 content::ContentTestLauncherDelegate::RunTestSuite(int, char**) content/test/content_test_launcher.cc:105:12 (content_browsertests+0x000000c677db) #33 content::LaunchTests(content::TestLauncherDelegate*, int, int, char**) content/public/test/test_launcher.cc:517:12 (content_browsertests+0x000000cfb2fc) #34 main content/test/content_test_launcher.cc:131:10 (content_browsertests+0x000000c67762) SUMMARY: ThreadSanitizer: data race media/audio/audio_manager.cc:264:20 in media::AudioManagerDeleter::operator()(media::AudioManager const*) const Original issue's description: > Pass task runners to AudioManager constructor. > > This patch replaces the internal AudioManagerBase::audio_thread with > an external task runner. The old implementation made it harder to test > and override the internal audio thread. > > AudioManagerBase::Shutdown had to complete on the audio thread before > the AudioManager instance could be deleted. It relied on Thread::Stop > on the main thread to wait for the audio thread to shutdown. A subclass > using a different thread shared with other modules could not do that. > > Passing a task runner into AudioManager and making GetTaskRunner > non-virtual ensures that the task runner will not change for the > lifetime of AudioManager instance. > > BUG=594234 > > Committed: https://crrev.com/e05981bd06b4694b426990acd41be8ab6d9a1659 > Cr-Commit-Position: refs/heads/master@{#388048} TBR=dalecurtis@chromium.org,tommi@chromium.org,xhwang@chromium.org,rkc@chromium.org,jam@chromium.org,ckehoe@chromium.org,alokp@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=594234 Committed: https://crrev.com/78655ccbbd314f7ceb4133cd0d395dd35502fdf9 Cr-Commit-Position: refs/heads/master@{#388096}

Patch Set 1 #

Unified diffs Side-by-side diffs Delta from patch set Stats (+1093 lines, -1080 lines) Patch
M chromecast/media/audio/cast_audio_manager.h View 2 chunks +3 lines, -8 lines 0 comments Download
M chromecast/media/audio/cast_audio_manager.cc View 1 chunk +4 lines, -9 lines 0 comments Download
M chromecast/media/audio/cast_audio_manager_factory.h View 1 chunk +2 lines, -4 lines 0 comments Download
M chromecast/media/audio/cast_audio_manager_factory.cc View 1 chunk +2 lines, -8 lines 0 comments Download
M chromecast/media/audio/cast_audio_output_stream_unittest.cc View 11 chunks +84 lines, -41 lines 0 comments Download
M components/audio_modem/BUILD.gn View 1 chunk +0 lines, -1 line 0 comments Download
M components/audio_modem/audio_player_impl.h View 1 chunk +4 lines, -0 lines 0 comments Download
M components/audio_modem/audio_player_impl.cc View 2 chunks +18 lines, -1 line 0 comments Download
M components/audio_modem/audio_player_unittest.cc View 7 chunks +17 lines, -25 lines 0 comments Download
M components/audio_modem/audio_recorder_impl.h View 1 chunk +4 lines, -0 lines 0 comments Download
M components/audio_modem/audio_recorder_impl.cc View 1 chunk +16 lines, -0 lines 0 comments Download
M components/audio_modem/audio_recorder_unittest.cc View 8 chunks +14 lines, -24 lines 0 comments Download
M content/browser/browser_main_loop.h View 4 chunks +2 lines, -5 lines 0 comments Download
M content/browser/browser_main_loop.cc View 3 chunks +3 lines, -31 lines 0 comments Download
M content/browser/renderer_host/media/audio_input_device_manager_unittest.cc View 14 chunks +32 lines, -25 lines 0 comments Download
M content/browser/renderer_host/media/audio_output_device_enumerator.cc View 1 chunk +1 line, -1 line 0 comments Download
M content/browser/renderer_host/media/audio_output_device_enumerator_unittest.cc View 4 chunks +9 lines, -10 lines 0 comments Download
M content/browser/renderer_host/media/audio_renderer_host.cc View 1 chunk +1 line, -1 line 0 comments Download
M content/browser/renderer_host/media/audio_renderer_host_unittest.cc View 2 chunks +2 lines, -3 lines 0 comments Download
M content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc View 2 chunks +4 lines, -5 lines 0 comments Download
M content/browser/renderer_host/media/media_stream_manager.cc View 1 chunk +1 line, -1 line 0 comments Download
M content/browser/renderer_host/media/media_stream_manager_unittest.cc View 5 chunks +12 lines, -14 lines 0 comments Download
M content/browser/renderer_host/media/video_capture_host_unittest.cc View 2 chunks +2 lines, -5 lines 0 comments Download
M content/browser/renderer_host/render_message_filter.cc View 1 chunk +1 line, -1 line 0 comments Download
M content/browser/speech/speech_recognizer_impl_unittest.cc View 4 chunks +7 lines, -4 lines 0 comments Download
M media/audio/alsa/alsa_output_unittest.cc View 5 chunks +10 lines, -11 lines 0 comments Download
M media/audio/alsa/audio_manager_alsa.h View 1 chunk +1 line, -4 lines 0 comments Download
M media/audio/alsa/audio_manager_alsa.cc View 1 chunk +2 lines, -7 lines 0 comments Download
M media/audio/android/audio_android_unittest.cc View 2 chunks +5 lines, -10 lines 0 comments Download
M media/audio/android/audio_manager_android.h View 2 chunks +2 lines, -4 lines 0 comments Download
M media/audio/android/audio_manager_android.cc View 3 chunks +19 lines, -22 lines 0 comments Download
M media/audio/audio_input_controller_unittest.cc View 6 chunks +32 lines, -21 lines 0 comments Download
M media/audio/audio_input_unittest.cc View 4 chunks +35 lines, -18 lines 0 comments Download
M media/audio/audio_low_latency_input_output_unittest.cc View 2 chunks +5 lines, -5 lines 0 comments Download
M media/audio/audio_manager.h View 6 chunks +19 lines, -54 lines 0 comments Download
M media/audio/audio_manager.cc View 3 chunks +30 lines, -68 lines 0 comments Download
M media/audio/audio_manager_base.h View 4 chunks +12 lines, -7 lines 0 comments Download
M media/audio/audio_manager_base.cc View 3 chunks +47 lines, -12 lines 0 comments Download
M media/audio/audio_manager_factory.h View 2 chunks +1 line, -11 lines 0 comments Download
M media/audio/audio_manager_factory_unittest.cc View 3 chunks +17 lines, -28 lines 0 comments Download
M media/audio/audio_manager_unittest.cc View 9 chunks +78 lines, -68 lines 0 comments Download
M media/audio/audio_output_controller_unittest.cc View 10 chunks +115 lines, -37 lines 0 comments Download
M media/audio/audio_output_proxy_unittest.cc View 3 chunks +8 lines, -6 lines 0 comments Download
M media/audio/cras/audio_manager_cras.h View 1 chunk +1 line, -4 lines 0 comments Download
M media/audio/cras/audio_manager_cras.cc View 1 chunk +2 lines, -7 lines 0 comments Download
M media/audio/cras/cras_input_unittest.cc View 4 chunks +6 lines, -15 lines 0 comments Download
M media/audio/cras/cras_unified_unittest.cc View 4 chunks +4 lines, -12 lines 0 comments Download
M media/audio/fake_audio_manager.h View 1 chunk +1 line, -4 lines 0 comments Download
M media/audio/fake_audio_manager.cc View 1 chunk +2 lines, -10 lines 0 comments Download
M media/audio/linux/audio_manager_linux.cc View 3 chunks +8 lines, -24 lines 0 comments Download
M media/audio/mac/audio_auhal_mac_unittest.cc View 3 chunks +5 lines, -7 lines 0 comments Download
M media/audio/mac/audio_low_latency_input_mac_unittest.cc View 2 chunks +3 lines, -7 lines 0 comments Download
M media/audio/mac/audio_manager_mac.h View 4 chunks +9 lines, -9 lines 0 comments Download
M media/audio/mac/audio_manager_mac.cc View 8 chunks +78 lines, -26 lines 0 comments Download
M media/audio/mock_audio_manager.h View 3 chunks +15 lines, -4 lines 0 comments Download
M media/audio/mock_audio_manager.cc View 2 chunks +11 lines, -2 lines 0 comments Download
M media/audio/pulse/audio_manager_pulse.h View 2 chunks +4 lines, -8 lines 0 comments Download
M media/audio/pulse/audio_manager_pulse.cc View 3 chunks +14 lines, -17 lines 0 comments Download
M media/audio/sounds/audio_stream_handler_unittest.cc View 4 chunks +6 lines, -8 lines 0 comments Download
M media/audio/sounds/sounds_manager_unittest.cc View 3 chunks +7 lines, -8 lines 0 comments Download
M media/audio/win/audio_low_latency_input_win_unittest.cc View 9 chunks +48 lines, -55 lines 0 comments Download
M media/audio/win/audio_low_latency_output_win_unittest.cc View 15 chunks +73 lines, -75 lines 0 comments Download
M media/audio/win/audio_manager_win.h View 2 chunks +2 lines, -4 lines 0 comments Download
M media/audio/win/audio_manager_win.cc View 4 chunks +15 lines, -16 lines 0 comments Download
M media/audio/win/audio_output_win_unittest.cc View 15 chunks +85 lines, -100 lines 0 comments Download
M media/cast/test/receiver.cc View 2 chunks +4 lines, -5 lines 0 comments Download
M media/mojo/services/mojo_media_application.h View 1 chunk +0 lines, -1 line 0 comments Download
M media/mojo/services/mojo_media_application.cc View 1 chunk +0 lines, -5 lines 0 comments Download
M media/mojo/services/mojo_media_client.h View 1 chunk +0 lines, -4 lines 0 comments Download
M media/mojo/services/mojo_media_client.cc View 1 chunk +0 lines, -2 lines 0 comments Download
M media/mojo/services/test_mojo_media_client.h View 3 chunks +2 lines, -3 lines 0 comments Download
M media/mojo/services/test_mojo_media_client.cc View 2 chunks +5 lines, -18 lines 0 comments Download

Messages

Total messages: 6 (2 generated)
Jeffrey Yasskin
Created Revert of Pass task runners to AudioManager constructor.
4 years, 8 months ago (2016-04-19 00:38:49 UTC) #1
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1901583005/1 View timeline at https://chromium-cq-status.appspot.com/patch-timeline/1901583005/1
4 years, 8 months ago (2016-04-19 00:39:24 UTC) #2
commit-bot: I haz the power
Committed patchset #1 (id:1)
4 years, 8 months ago (2016-04-19 00:40:50 UTC) #4
commit-bot: I haz the power
4 years, 8 months ago (2016-04-19 00:42:15 UTC) #6
Message was sent while issue was closed.
Patchset 1 (id:??) landed as
https://crrev.com/78655ccbbd314f7ceb4133cd0d395dd35502fdf9
Cr-Commit-Position: refs/heads/master@{#388096}

Powered by Google App Engine
This is Rietveld 408576698