New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 690588 link

Starred by 1 user

Issue metadata

Status: Fixed
Owner:
Closed: Feb 2017
Cc:
EstimatedDays: ----
NextAction: ----
OS: ----
Pri: 1
Type: Bug

Blocking:
issue 437454



Sign in to add a comment

LayerTreeHostTestReadyToDrawVisibility has a thread race

Project Member Reported by danakj@chromium.org, Feb 9 2017

Issue description

[ RUN      ] LayerTreeHostTestReadyToDrawVisibility.RunSingleThread_DelegatingRenderer
==================
WARNING: ThreadSanitizer: data race (pid=36663)
  Write of size 8 at 0x7b18000028f0 by main thread (mutexes: write M3782, write M3767):
    #0 erase buildtools/third_party/libc++/trunk/include/__tree:1969 (cc_unittests+0x0000013b9b46)
    #1 __erase_unique<int> buildtools/third_party/libc++/trunk/include/__tree:1996 (cc_unittests+0x0000013b9b46)
    #2 erase buildtools/third_party/libc++/trunk/include/map:1238 (cc_unittests+0x0000013b9b46)
    #3 OnGpuMemoryBufferDestroyed cc/test/test_gpu_memory_buffer_manager.cc:152 (cc_unittests+0x0000013b9b46)
    #4 ~GpuMemoryBufferImpl cc/test/test_gpu_memory_buffer_manager.cc:37 (cc_unittests+0x0000013b9b46)
    #5 cc::(anonymous namespace)::GpuMemoryBufferImpl::~GpuMemoryBufferImpl() cc/test/test_gpu_memory_buffer_manager.cc:37 (cc_unittests+0x0000013b9bd9)
    #6 operator() buildtools/third_party/libc++/trunk/include/memory:2529 (discriminator 1) (cc_unittests+0x0000012826a8)
    #7 reset buildtools/third_party/libc++/trunk/include/memory:2735 (discriminator 1) (cc_unittests+0x0000012826a8)
    #8 ~unique_ptr buildtools/third_party/libc++/trunk/include/memory:2703 (discriminator 1) (cc_unittests+0x0000012826a8)
    #9 ~StagingBuffer cc/raster/staging_buffer_pool.cc:77 (discriminator 1) (cc_unittests+0x0000012826a8)
    #10 operator() buildtools/third_party/libc++/trunk/include/memory:2529 (discriminator 1) (cc_unittests+0x0000012826a8)
    #11 reset buildtools/third_party/libc++/trunk/include/memory:2735 (discriminator 1) (cc_unittests+0x0000012826a8)
    #12 ~unique_ptr buildtools/third_party/libc++/trunk/include/memory:2703 (discriminator 1) (cc_unittests+0x0000012826a8)
    #13 destroy buildtools/third_party/libc++/trunk/include/memory:1795 (discriminator 1) (cc_unittests+0x0000012826a8)
    #14 __destroy<std::__1::unique_ptr<cc::StagingBuffer, std::__1::default_delete<cc::StagingBuffer> > > buildtools/third_party/libc++/trunk/include/memory:1668 (discriminator 1) (cc_unittests+0x0000012826a8)
    #15 destroy<std::__1::unique_ptr<cc::StagingBuffer, std::__1::default_delete<cc::StagingBuffer> > > buildtools/third_party/libc++/trunk/include/memory:1536 (discriminator 1) (cc_unittests+0x0000012826a8)
    #16 pop_front buildtools/third_party/libc++/trunk/include/deque:2568 (discriminator 1) (cc_unittests+0x0000012826a8)
    #17 ReleaseBuffersNotUsedSince cc/raster/staging_buffer_pool.cc:430 (discriminator 1) (cc_unittests+0x0000012826a8)
    #18 ReduceMemoryUsage cc/raster/staging_buffer_pool.cc:388 (discriminator 1) (cc_unittests+0x000001281b7b)
    #19 Invoke<const base::WeakPtr<cc::StagingBufferPool> &> base/bind_internal.h:214 (discriminator 3) (cc_unittests+0x000001285247)
    #20 MakeItSo<void (cc::StagingBufferPool::*const &)(), const base::WeakPtr<cc::StagingBufferPool> &> base/bind_internal.h:305 (discriminator 3) (cc_unittests+0x000001285247)
    #21 RunImpl<void (cc::StagingBufferPool::*const &)(), const std::__1::tuple<base::WeakPtr<cc::StagingBufferPool> > &, 0> base/bind_internal.h:361 (discriminator 3) (cc_unittests+0x000001285247)
    #22 Run base/bind_internal.h:339 (discriminator 3) (cc_unittests+0x000001285247)
    #23 Run base/callback.h:68 (discriminator 1) (cc_unittests+0x000001586dfc)
    #24 RunTask base/debug/task_annotator.cc:52 (discriminator 1) (cc_unittests+0x000001586dfc)
    #25 RunTask base/message_loop/message_loop.cc:421 (cc_unittests+0x00000151fdb2)
    #26 DeferOrRunPendingTask base/message_loop/message_loop.cc:430 (cc_unittests+0x00000152036d)
    #27 DoDelayedWork base/message_loop/message_loop.cc:562 (discriminator 2) (cc_unittests+0x000001520e58)
    #28 Run base/message_loop/message_pump_default.cc:37 (cc_unittests+0x000001524254)
    #29 RunHandler base/message_loop/message_loop.cc:386 (discriminator 1) (cc_unittests+0x00000151f8db)
    #30 Run base/run_loop.cc:37 (cc_unittests+0x0000015397b9)
    #31 RunTest cc/test/layer_tree_test.cc:764 (discriminator 1) (cc_unittests+0x0000013a437d)
    #32 cc::(anonymous namespace)::LayerTreeHostTestReadyToDrawVisibility_RunSingleThread_DelegatingRenderer_Test::TestBody() cc/trees/layer_tree_host_unittest.cc:437 (cc_unittests+0x000000e82574)
    #33 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458 (discriminator 3) (cc_unittests+0x000001472536)
    #34 Run testing/gtest/src/gtest.cc:2474 (discriminator 3) (cc_unittests+0x000001472536)
    #35 Run testing/gtest/src/gtest.cc:2656 (cc_unittests+0x0000014736dc)
    #36 Run testing/gtest/src/gtest.cc:2774 (discriminator 1) (cc_unittests+0x000001473fb6)
    #37 RunAllTests testing/gtest/src/gtest.cc:4647 (discriminator 1) (cc_unittests+0x00000147eed6)
    #38 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458 (discriminator 3) (cc_unittests+0x00000147e769)
    #39 Run testing/gtest/src/gtest.cc:4255 (discriminator 3) (cc_unittests+0x00000147e769)
    #40 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237 (discriminator 1) (cc_unittests+0x0000013c6879)
    #41 Run base/test/test_suite.cc:271 (discriminator 1) (cc_unittests+0x0000013c6879)
    #42 Invoke<cc::CCTestSuite *> base/bind_internal.h:214 (discriminator 3) (cc_unittests+0x000001147c95)
    #43 MakeItSo<int (base::TestSuite::*const &)(), cc::CCTestSuite *> base/bind_internal.h:285 (discriminator 3) (cc_unittests+0x000001147c95)
    #44 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<cc::CCTestSuite> > &, 0> base/bind_internal.h:361 (discriminator 3) (cc_unittests+0x000001147c95)
    #45 Run base/bind_internal.h:339 (discriminator 3) (cc_unittests+0x000001147c95)
    #46 Run base/callback.h:85 (discriminator 1) (cc_unittests+0x0000013c8113)
    #47 LaunchUnitTestsInternal base/test/launcher/unit_test_launcher.cc:211 (discriminator 1) (cc_unittests+0x0000013c8113)
    #48 LaunchUnitTests base/test/launcher/unit_test_launcher.cc:453 (cc_unittests+0x0000013c7f9a)
    #49 main cc/test/run_all_unittests.cc:15 (cc_unittests+0x000001147be5)

 
Blocking: 437454
  Previous read of size 8 at 0x7b18000028f0 by thread T1:
    [failed to restore the stack]

  Thread T1 'TestTaskGraphRu' (tid=36665, running) created by main thread at:
    #0 pthread_create ??:? (cc_unittests+0x0000004f59a5)
    #1 CreateThread base/threading/platform_thread_posix.cc:110 (discriminator 1) (cc_unittests+0x00000154f237)
    #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:191 (cc_unittests+0x00000154f135)
    #3 base::SimpleThread::Start() base/threading/simple_thread.cc:34 (cc_unittests+0x000001554cf3)
    #4 Start cc/raster/single_thread_task_graph_runner.cc:30 (discriminator 1) (cc_unittests+0x0000012808bd)
    #5 TestTaskGraphRunner cc/test/test_task_graph_runner.cc:10 (discriminator 2) (cc_unittests+0x0000013bc36e)
    #6 RunTest cc/test/layer_tree_test.cc:746 (discriminator 1) (cc_unittests+0x0000013a4133)
    #7 cc::(anonymous namespace)::LayerTreeHostTestReadyToDrawVisibility_RunSingleThread_DelegatingRenderer_Test::TestBody() cc/trees/layer_tree_host_unittest.cc:437 (cc_unittests+0x000000e82574)
    #8 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458 (discriminator 3) (cc_unittests+0x000001472536)
    #9 Run testing/gtest/src/gtest.cc:2474 (discriminator 3) (cc_unittests+0x000001472536)
    #10 Run testing/gtest/src/gtest.cc:2656 (cc_unittests+0x0000014736dc)
    #11 Run testing/gtest/src/gtest.cc:2774 (discriminator 1) (cc_unittests+0x000001473fb6)
    #12 RunAllTests testing/gtest/src/gtest.cc:4647 (discriminator 1) (cc_unittests+0x00000147eed6)
    #13 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458 (discriminator 3) (cc_unittests+0x00000147e769)
    #14 Run testing/gtest/src/gtest.cc:4255 (discriminator 3) (cc_unittests+0x00000147e769)
    #15 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237 (discriminator 1) (cc_unittests+0x0000013c6879)
    #16 Run base/test/test_suite.cc:271 (discriminator 1) (cc_unittests+0x0000013c6879)
    #17 Invoke<cc::CCTestSuite *> base/bind_internal.h:214 (discriminator 3) (cc_unittests+0x000001147c95)
    #18 MakeItSo<int (base::TestSuite::*const &)(), cc::CCTestSuite *> base/bind_internal.h:285 (discriminator 3) (cc_unittests+0x000001147c95)
    #19 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<cc::CCTestSuite> > &, 0> base/bind_internal.h:361 (discriminator 3) (cc_unittests+0x000001147c95)
    #20 Run base/bind_internal.h:339 (discriminator 3) (cc_unittests+0x000001147c95)
    #21 Run base/callback.h:85 (discriminator 1) (cc_unittests+0x0000013c8113)
    #22 LaunchUnitTestsInternal base/test/launcher/unit_test_launcher.cc:211 (discriminator 1) (cc_unittests+0x0000013c8113)
    #23 LaunchUnitTests base/test/launcher/unit_test_launcher.cc:453 (cc_unittests+0x0000013c7f9a)
    #24 main cc/test/run_all_unittests.cc:15 (cc_unittests+0x000001147be5)

LayerTreeHostTestReadyToDrawNonEmpty.RunSingleThread_DelegatingRenderer has the same problem. I got a trace of T1 there:

[ RUN      ] LayerTreeHostTestReadyToDrawNonEmpty.RunSingleThread_DelegatingRenderer
==================
WARNING: ThreadSanitizer: data race (pid=42566)
  Write of size 8 at 0x7b18000028f0 by main thread (mutexes: write M3782, write M3767):
    #0 erase buildtools/third_party/libc++/trunk/include/__tree:1969 (cc_unittests+0x0000013b9b46)
    #1 __erase_unique<int> buildtools/third_party/libc++/trunk/include/__tree:1996 (cc_unittests+0x0000013b9b46)
    #2 erase buildtools/third_party/libc++/trunk/include/map:1238 (cc_unittests+0x0000013b9b46)
    #3 OnGpuMemoryBufferDestroyed cc/test/test_gpu_memory_buffer_manager.cc:152 (cc_unittests+0x0000013b9b46)
    #4 ~GpuMemoryBufferImpl cc/test/test_gpu_memory_buffer_manager.cc:37 (cc_unittests+0x0000013b9b46)
    #5 cc::(anonymous namespace)::GpuMemoryBufferImpl::~GpuMemoryBufferImpl() cc/test/test_gpu_memory_buffer_manager.cc:37 (cc_unittests+0x0000013b9bd9)
    #6 operator() buildtools/third_party/libc++/trunk/include/memory:2529 (discriminator 1) (cc_unittests+0x0000012826a8)
    #7 reset buildtools/third_party/libc++/trunk/include/memory:2735 (discriminator 1) (cc_unittests+0x0000012826a8)
    #8 ~unique_ptr buildtools/third_party/libc++/trunk/include/memory:2703 (discriminator 1) (cc_unittests+0x0000012826a8)
    #9 ~StagingBuffer cc/raster/staging_buffer_pool.cc:77 (discriminator 1) (cc_unittests+0x0000012826a8)
    #10 operator() buildtools/third_party/libc++/trunk/include/memory:2529 (discriminator 1) (cc_unittests+0x0000012826a8)
    #11 reset buildtools/third_party/libc++/trunk/include/memory:2735 (discriminator 1) (cc_unittests+0x0000012826a8)
    #12 ~unique_ptr buildtools/third_party/libc++/trunk/include/memory:2703 (discriminator 1) (cc_unittests+0x0000012826a8)
    #13 destroy buildtools/third_party/libc++/trunk/include/memory:1795 (discriminator 1) (cc_unittests+0x0000012826a8)
    #14 __destroy<std::__1::unique_ptr<cc::StagingBuffer, std::__1::default_delete<cc::StagingBuffer> > > buildtools/third_party/libc++/trunk/include/memory:1668 (discriminator 1) (cc_unittests+0x0000012826a8)
    #15 destroy<std::__1::unique_ptr<cc::StagingBuffer, std::__1::default_delete<cc::StagingBuffer> > > buildtools/third_party/libc++/trunk/include/memory:1536 (discriminator 1) (cc_unittests+0x0000012826a8)
    #16 pop_front buildtools/third_party/libc++/trunk/include/deque:2568 (discriminator 1) (cc_unittests+0x0000012826a8)
    #17 ReleaseBuffersNotUsedSince cc/raster/staging_buffer_pool.cc:430 (discriminator 1) (cc_unittests+0x0000012826a8)
    #18 ReduceMemoryUsage cc/raster/staging_buffer_pool.cc:388 (discriminator 1) (cc_unittests+0x000001281b7b)
    #19 Invoke<const base::WeakPtr<cc::StagingBufferPool> &> base/bind_internal.h:214 (discriminator 3) (cc_unittests+0x000001285247)
    #20 MakeItSo<void (cc::StagingBufferPool::*const &)(), const base::WeakPtr<cc::StagingBufferPool> &> base/bind_internal.h:305 (discriminator 3) (cc_unittests+0x000001285247)
    #21 RunImpl<void (cc::StagingBufferPool::*const &)(), const std::__1::tuple<base::WeakPtr<cc::StagingBufferPool> > &, 0> base/bind_internal.h:361 (discriminator 3) (cc_unittests+0x000001285247)
    #22 Run base/bind_internal.h:339 (discriminator 3) (cc_unittests+0x000001285247)
    #23 Run base/callback.h:68 (discriminator 1) (cc_unittests+0x000001586dfc)
    #24 RunTask base/debug/task_annotator.cc:52 (discriminator 1) (cc_unittests+0x000001586dfc)
    #25 RunTask base/message_loop/message_loop.cc:421 (cc_unittests+0x00000151fdb2)
    #26 DeferOrRunPendingTask base/message_loop/message_loop.cc:430 (cc_unittests+0x00000152036d)
    #27 DoDelayedWork base/message_loop/message_loop.cc:562 (discriminator 2) (cc_unittests+0x000001520e58)
    #28 Run base/message_loop/message_pump_default.cc:37 (cc_unittests+0x000001524254)
    #29 RunHandler base/message_loop/message_loop.cc:386 (discriminator 1) (cc_unittests+0x00000151f8db)
    #30 Run base/run_loop.cc:37 (cc_unittests+0x0000015397b9)
    #31 RunTest cc/test/layer_tree_test.cc:764 (discriminator 1) (cc_unittests+0x0000013a437d)
    #32 cc::(anonymous namespace)::LayerTreeHostTestReadyToDrawNonEmpty_RunSingleThread_DelegatingRenderer_Test::TestBody() cc/trees/layer_tree_host_unittest.cc:363 (cc_unittests+0x000000e81b74)
    #33 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458 (discriminator 3) (cc_unittests+0x000001472536)
    #34 Run testing/gtest/src/gtest.cc:2474 (discriminator 3) (cc_unittests+0x000001472536)
    #35 Run testing/gtest/src/gtest.cc:2656 (cc_unittests+0x0000014736dc)
    #36 Run testing/gtest/src/gtest.cc:2774 (discriminator 1) (cc_unittests+0x000001473fb6)
    #37 RunAllTests testing/gtest/src/gtest.cc:4647 (discriminator 1) (cc_unittests+0x00000147eed6)
    #38 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458 (discriminator 3) (cc_unittests+0x00000147e769)
    #39 Run testing/gtest/src/gtest.cc:4255 (discriminator 3) (cc_unittests+0x00000147e769)
    #40 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237 (discriminator 1) (cc_unittests+0x0000013c6879)
    #41 Run base/test/test_suite.cc:271 (discriminator 1) (cc_unittests+0x0000013c6879)
    #42 Invoke<cc::CCTestSuite *> base/bind_internal.h:214 (discriminator 3) (cc_unittests+0x000001147c95)
    #43 MakeItSo<int (base::TestSuite::*const &)(), cc::CCTestSuite *> base/bind_internal.h:285 (discriminator 3) (cc_unittests+0x000001147c95)
    #44 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<cc::CCTestSuite> > &, 0> base/bind_internal.h:361 (discriminator 3) (cc_unittests+0x000001147c95)
    #45 Run base/bind_internal.h:339 (discriminator 3) (cc_unittests+0x000001147c95)
    #46 Run base/callback.h:85 (discriminator 1) (cc_unittests+0x0000013c8113)
    #47 LaunchUnitTestsInternal base/test/launcher/unit_test_launcher.cc:211 (discriminator 1) (cc_unittests+0x0000013c8113)
    #48 LaunchUnitTests base/test/launcher/unit_test_launcher.cc:453 (cc_unittests+0x0000013c7f9a)
    #49 main cc/test/run_all_unittests.cc:15 (cc_unittests+0x000001147be5)

  Previous read of size 8 at 0x7b18000028f0 by thread T1:
    #0 __insert_node_at buildtools/third_party/libc++/trunk/include/__tree:1704 (cc_unittests+0x0000013b9850)
    #1 operator[] buildtools/third_party/libc++/trunk/include/map:1542 (cc_unittests+0x0000013b9850)
    #2 CreateGpuMemoryBuffer cc/test/test_gpu_memory_buffer_manager.cc:171 (cc_unittests+0x0000013b9850)
    #3 PlaybackToStagingBuffer cc/raster/one_copy_raster_buffer_provider.cc:226 (discriminator 1) (cc_unittests+0x00000127f143)
    #4 PlaybackAndCopyOnWorkerThread cc/raster/one_copy_raster_buffer_provider.cc:200 (discriminator 1) (cc_unittests+0x00000127e81d)
    #5 Playback cc/raster/one_copy_raster_buffer_provider.cc:62 (cc_unittests+0x00000127e5ae)
    #6 RunOnWorkerThread cc/tiles/tile_manager.cc:129 (discriminator 2) (cc_unittests+0x0000012e795e)
    #7 RunTaskWithLockAcquired cc/raster/single_thread_task_graph_runner.cc:154 (discriminator 1) (cc_unittests+0x0000012812c3)
    #8 Run cc/raster/single_thread_task_graph_runner.cc:117 (cc_unittests+0x00000128152f)
    #9 <null> cc/raster/single_thread_task_graph_runner.cc:? (cc_unittests+0x00000128152f)
    #10 base::DelegateSimpleThread::Run() base/threading/simple_thread.cc:92 (cc_unittests+0x000001554fb8)
    #11 ThreadMain base/threading/simple_thread.cc:68 (cc_unittests+0x000001554e22)
    #12 ThreadFunc base/threading/platform_thread_posix.cc:71 (cc_unittests+0x00000154f56d)


Owner: danakj@chromium.org
Status: Started (was: Available)
Project Member

Comment 5 by bugdroid1@chromium.org, Feb 9 2017

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/5cd331dec1c51a6040c15c1afb4eb03d77187dbe

commit 5cd331dec1c51a6040c15c1afb4eb03d77187dbe
Author: danakj <danakj@chromium.org>
Date: Thu Feb 09 21:51:08 2017

cc: Lock access to |buffers_| in TestGpuMemoryBufferManager

The manager is used to create buffers on one thread that may be
destroyed on another thread. When destroyed they call back to the
TestGpuMemoryBufferManager causing a data race.

R=vmpstr@chromium.org
BUG= 690588 
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel

Review-Url: https://codereview.chromium.org/2682743007
Cr-Commit-Position: refs/heads/master@{#449426}

[modify] https://crrev.com/5cd331dec1c51a6040c15c1afb4eb03d77187dbe/cc/test/test_gpu_memory_buffer_manager.cc
[modify] https://crrev.com/5cd331dec1c51a6040c15c1afb4eb03d77187dbe/cc/test/test_gpu_memory_buffer_manager.h

Status: Fixed (was: Started)

Sign in to add a comment