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

Issue 638575 link

Starred by 1 user

Issue metadata

Status: Fixed
Owner:
Closed: Jan 16
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: ----
Pri: 3
Type: Bug



Sign in to add a comment

Data race on gOnce in SkLineClipper.cpp

Project Member Reported by glider@chromium.org, Aug 17 2016

Issue description

Noticed this in the trybot log at https://chromium-swarm.appspot.com/user/task/30b126bf3b5cac10:

==================
WARNING: ThreadSanitizer: data race (pid=15122)
  Read of size 1 at 0x00000a4b2338 by thread T4:
    #0 SkLineClipper::ClipLine(SkPoint const*, SkRect const&, SkPoint*, bool) third_party/skia/src/core/SkLineClipper.cpp:176 (content_browsertests+0x0000032a3e68)
    #1 SkEdgeBuilder::buildPoly(SkPath const&, SkIRect const*, int, bool) third_party/skia/src/core/SkEdgeBuilder.cpp:178:37 (content_browsertests+0x000003268f14)
    #2 SkEdgeBuilder::build(SkPath const&, SkIRect const*, int, bool) third_party/skia/src/core/SkEdgeBuilder.cpp:241:22 (content_browsertests+0x00000326947f)
    #3 sk_fill_path(SkPath const&, SkIRect const*, SkBlitter*, int, int, int, SkRegion const&) third_party/skia/src/core/SkScan_Path.cpp:438:25 (content_browsertests+0x000003057aaf)
    #4 SkScan::AntiFillPath(SkPath const&, SkRegion const&, SkBlitter*, bool) third_party/skia/src/core/SkScan_AntiPath.cpp:722:9 (content_browsertests+0x00000304e5ed)
    #5 SkScan::AntiFillPath(SkPath const&, SkRasterClip const&, SkBlitter*) third_party/skia/src/core/SkScan_AntiPath.cpp:759:9 (content_browsertests+0x00000304ea5e)
    #6 SkDraw::drawDevPath(SkPath const&, SkPaint const&, bool, SkBlitter*, bool) const third_party/skia/src/core/SkDraw.cpp:1100:5 (content_browsertests+0x000002fb3042)
    #7 SkDraw::drawPath(SkPath const&, SkPaint const&, SkMatrix const*, bool, bool, SkBlitter*) const third_party/skia/src/core/SkDraw.cpp:1193:11 (content_browsertests+0x000002fb365a)
    #8 drawPath third_party/skia/include/core/SkDraw.h:54:15 (content_browsertests+0x000003237735)
    #9 SkBitmapDevice::drawPath(SkDraw const&, SkPath const&, SkPaint const&, SkMatrix const*, bool) third_party/skia/src/core/SkBitmapDevice.cpp:229 (content_browsertests+0x000003237735)
    #10 SkBaseDevice::drawDRRect(SkDraw const&, SkRRect const&, SkRRect const&, SkPaint const&) third_party/skia/src/core/SkDevice.cpp:85:11 (content_browsertests+0x000002facb37)
    #11 SkCanvas::onDrawDRRect(SkRRect const&, SkRRect const&, SkPaint const&) third_party/skia/src/core/SkCanvas.cpp:2320:23 (content_browsertests+0x000002f9546e)
    #12 SkCanvas::drawDRRect(SkRRect const&, SkRRect const&, SkPaint const&) third_party/skia/src/core/SkCanvas.cpp:1984:11 (content_browsertests+0x000002f92375)
    #13 draw<SkRecords::DrawDRRect> third_party/skia/src/core/SkRecordDraw.cpp:98:1 (content_browsertests+0x0000030281d6)
    #14 operator()<SkRecords::DrawDRRect> third_party/skia/src/core/SkRecordDraw.h:62 (content_browsertests+0x0000030281d6)
    #15 decltype ({parm#1}((SkRecords::NoOp)())) SkRecord::Record::visit<SkRecords::Draw&>(SkRecords::Draw&) const third_party/skia/src/core/SkRecord.h:170 (content_browsertests+0x0000030281d6)
    #16 visit<SkRecords::Draw &> third_party/skia/src/core/SkRecord.h:51:28 (content_browsertests+0x0000030276a5)
    #17 SkRecordDraw(SkRecord const&, SkCanvas*, SkPicture const* const*, SkDrawable* const*, int, SkBBoxHierarchy const*, SkPicture::AbortCallback*) third_party/skia/src/core/SkRecordDraw.cpp:54 (content_browsertests+0x0000030276a5)
    #18 SkBigPicture::playback(SkCanvas*, SkPicture::AbortCallback*) const third_party/skia/src/core/SkBigPicture.cpp:35:5 (content_browsertests+0x000003233670)
    #19 SkCanvas::drawPicture(SkPicture const*, SkMatrix const*, SkPaint const*) third_party/skia/src/core/SkCanvas.cpp:3126:18 (content_browsertests+0x000002f9c9d2)
    #20 drawPicture third_party/skia/include/core/SkCanvas.h:1051:15 (content_browsertests+0x0000035a70a3)
    #21 cc::DrawingDisplayItem::Raster(SkCanvas*, SkPicture::AbortCallback*) const cc/playback/drawing_display_item.cc:91 (content_browsertests+0x0000035a70a3)
    #22 cc::DisplayItemList::Raster(SkCanvas*, SkPicture::AbortCallback*) const cc/playback/display_item_list.cc:141:26 (content_browsertests+0x0000035a39ab)
    #23 cc::RasterSource::RasterCommon(SkCanvas*, SkPicture::AbortCallback*) const cc/playback/raster_source.cc:199:20 (content_browsertests+0x0000035a9306)
    #24 cc::RasterSource::PlaybackToCanvas(SkCanvas*, cc::RasterSource::PlaybackSettings const&) const cc/playback/raster_source.cc:112:5 (content_browsertests+0x0000035a8e00)
    #25 cc::RasterSource::PlaybackToCanvas(SkCanvas*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&) const cc/playback/raster_source.cc:83:3 (content_browsertests+0x0000035a8bb5)
    #26 cc::RasterBufferProvider::PlaybackToMemory(void*, cc::ResourceFormat, gfx::Size const&, unsigned long, cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&) cc/raster/raster_buffer_provider.cc:81:22 (content_browsertests+0x0000036ab912)
    #27 cc::OneCopyRasterBufferProvider::PlaybackToStagingBuffer(cc::StagingBuffer*, cc::Resource const*, cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&, unsigned long, unsigned long) cc/raster/one_copy_raster_buffer_provider.cc:258:5 (content_browsertests+0x0000036aa7ba)
    #28 cc::OneCopyRasterBufferProvider::PlaybackAndCopyOnWorkerThread(cc::Resource const*, cc::ResourceProvider::ScopedWriteLockGL*, gpu::SyncToken const&, cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&, unsigned long, unsigned long) cc/raster/one_copy_raster_buffer_provider.cc:194:3 (content_browsertests+0x0000036a97d5)
    #29 cc::OneCopyRasterBufferProvider::RasterBufferImpl::Playback(cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, unsigned long, float, cc::RasterSource::PlaybackSettings const&) cc/raster/one_copy_raster_buffer_provider.cc:60:12 (content_browsertests+0x0000036a9517)
    #30 cc::(anonymous namespace)::RasterTaskImpl::RunOnWorkerThread() cc/tiles/tile_manager.cc:92:21 (content_browsertests+0x0000035ea185)
    #31 content::CategorizedWorkerPool::RunTaskInCategoryWithLockAcquired(cc::TaskCategory) content/renderer/categorized_worker_pool.cc:360:11 (content_browsertests+0x00000440eafe)
    #32 RunTaskWithLockAcquired content/renderer/categorized_worker_pool.cc:338:7 (content_browsertests+0x00000440d413)
    #33 content::CategorizedWorkerPool::Run(std::__1::vector<cc::TaskCategory, std::__1::allocator<cc::TaskCategory> > const&, base::ConditionVariable*) content/renderer/categorized_worker_pool.cc:230 (content_browsertests+0x00000440d413)
    #34 content::(anonymous namespace)::CategorizedWorkerPoolThread::Run() content/renderer/categorized_worker_pool.cc:35:32 (content_browsertests+0x00000440ef6e)
    #35 base::SimpleThread::ThreadMain() base/threading/simple_thread.cc:68:3 (content_browsertests+0x000002cc5e22)
    #36 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (content_browsertests+0x000002cc0168)

  Previous write of size 1 at 0x00000a4b2338 by thread T5:
    #0 SkLineClipper::ClipLine(SkPoint const*, SkRect const&, SkPoint*, bool) third_party/skia/src/core/SkLineClipper.cpp:181:13 (content_browsertests+0x0000032a3e7e)
    #1 SkEdgeBuilder::buildPoly(SkPath const&, SkIRect const*, int, bool) third_party/skia/src/core/SkEdgeBuilder.cpp:178:37 (content_browsertests+0x000003268f14)
    #2 SkEdgeBuilder::build(SkPath const&, SkIRect const*, int, bool) third_party/skia/src/core/SkEdgeBuilder.cpp:241:22 (content_browsertests+0x00000326947f)
    #3 sk_fill_path(SkPath const&, SkIRect const*, SkBlitter*, int, int, int, SkRegion const&) third_party/skia/src/core/SkScan_Path.cpp:438:25 (content_browsertests+0x000003057aaf)
    #4 SkScan::AntiFillPath(SkPath const&, SkRegion const&, SkBlitter*, bool) third_party/skia/src/core/SkScan_AntiPath.cpp:722:9 (content_browsertests+0x00000304e5ed)
    #5 SkScan::AntiFillPath(SkPath const&, SkRasterClip const&, SkBlitter*) third_party/skia/src/core/SkScan_AntiPath.cpp:759:9 (content_browsertests+0x00000304ea5e)
    #6 SkDraw::drawDevPath(SkPath const&, SkPaint const&, bool, SkBlitter*, bool) const third_party/skia/src/core/SkDraw.cpp:1100:5 (content_browsertests+0x000002fb3042)
    #7 SkDraw::drawPath(SkPath const&, SkPaint const&, SkMatrix const*, bool, bool, SkBlitter*) const third_party/skia/src/core/SkDraw.cpp:1193:11 (content_browsertests+0x000002fb365a)
    #8 drawPath third_party/skia/include/core/SkDraw.h:54:15 (content_browsertests+0x000003237735)
    #9 SkBitmapDevice::drawPath(SkDraw const&, SkPath const&, SkPaint const&, SkMatrix const*, bool) third_party/skia/src/core/SkBitmapDevice.cpp:229 (content_browsertests+0x000003237735)
    #10 SkBaseDevice::drawDRRect(SkDraw const&, SkRRect const&, SkRRect const&, SkPaint const&) third_party/skia/src/core/SkDevice.cpp:85:11 (content_browsertests+0x000002facb37)
    #11 SkCanvas::onDrawDRRect(SkRRect const&, SkRRect const&, SkPaint const&) third_party/skia/src/core/SkCanvas.cpp:2320:23 (content_browsertests+0x000002f9546e)
    #12 SkCanvas::drawDRRect(SkRRect const&, SkRRect const&, SkPaint const&) third_party/skia/src/core/SkCanvas.cpp:1984:11 (content_browsertests+0x000002f92375)
    #13 draw<SkRecords::DrawDRRect> third_party/skia/src/core/SkRecordDraw.cpp:98:1 (content_browsertests+0x0000030281d6)
    #14 operator()<SkRecords::DrawDRRect> third_party/skia/src/core/SkRecordDraw.h:62 (content_browsertests+0x0000030281d6)
    #15 decltype ({parm#1}((SkRecords::NoOp)())) SkRecord::Record::visit<SkRecords::Draw&>(SkRecords::Draw&) const third_party/skia/src/core/SkRecord.h:170 (content_browsertests+0x0000030281d6)
    #16 visit<SkRecords::Draw &> third_party/skia/src/core/SkRecord.h:51:28 (content_browsertests+0x0000030276a5)
    #17 SkRecordDraw(SkRecord const&, SkCanvas*, SkPicture const* const*, SkDrawable* const*, int, SkBBoxHierarchy const*, SkPicture::AbortCallback*) third_party/skia/src/core/SkRecordDraw.cpp:54 (content_browsertests+0x0000030276a5)
    #18 SkBigPicture::playback(SkCanvas*, SkPicture::AbortCallback*) const third_party/skia/src/core/SkBigPicture.cpp:35:5 (content_browsertests+0x000003233670)
    #19 SkCanvas::drawPicture(SkPicture const*, SkMatrix const*, SkPaint const*) third_party/skia/src/core/SkCanvas.cpp:3126:18 (content_browsertests+0x000002f9c9d2)
    #20 drawPicture third_party/skia/include/core/SkCanvas.h:1051:15 (content_browsertests+0x0000035a70a3)
    #21 cc::DrawingDisplayItem::Raster(SkCanvas*, SkPicture::AbortCallback*) const cc/playback/drawing_display_item.cc:91 (content_browsertests+0x0000035a70a3)
    #22 cc::DisplayItemList::Raster(SkCanvas*, SkPicture::AbortCallback*) const cc/playback/display_item_list.cc:141:26 (content_browsertests+0x0000035a39ab)
    #23 cc::RasterSource::RasterCommon(SkCanvas*, SkPicture::AbortCallback*) const cc/playback/raster_source.cc:199:20 (content_browsertests+0x0000035a9306)
    #24 cc::RasterSource::PlaybackToCanvas(SkCanvas*, cc::RasterSource::PlaybackSettings const&) const cc/playback/raster_source.cc:112:5 (content_browsertests+0x0000035a8e00)
    #25 cc::RasterSource::PlaybackToCanvas(SkCanvas*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&) const cc/playback/raster_source.cc:83:3 (content_browsertests+0x0000035a8bb5)
    #26 cc::RasterBufferProvider::PlaybackToMemory(void*, cc::ResourceFormat, gfx::Size const&, unsigned long, cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&) cc/raster/raster_buffer_provider.cc:81:22 (content_browsertests+0x0000036ab912)
    #27 cc::OneCopyRasterBufferProvider::PlaybackToStagingBuffer(cc::StagingBuffer*, cc::Resource const*, cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&, unsigned long, unsigned long) cc/raster/one_copy_raster_buffer_provider.cc:258:5 (content_browsertests+0x0000036aa7ba)
    #28 cc::OneCopyRasterBufferProvider::PlaybackAndCopyOnWorkerThread(cc::Resource const*, cc::ResourceProvider::ScopedWriteLockGL*, gpu::SyncToken const&, cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, float, cc::RasterSource::PlaybackSettings const&, unsigned long, unsigned long) cc/raster/one_copy_raster_buffer_provider.cc:194:3 (content_browsertests+0x0000036a97d5)
    #29 cc::OneCopyRasterBufferProvider::RasterBufferImpl::Playback(cc::RasterSource const*, gfx::Rect const&, gfx::Rect const&, unsigned long, float, cc::RasterSource::PlaybackSettings const&) cc/raster/one_copy_raster_buffer_provider.cc:60:12 (content_browsertests+0x0000036a9517)
    #30 cc::(anonymous namespace)::RasterTaskImpl::RunOnWorkerThread() cc/tiles/tile_manager.cc:92:21 (content_browsertests+0x0000035ea185)
    #31 content::CategorizedWorkerPool::RunTaskInCategoryWithLockAcquired(cc::TaskCategory) content/renderer/categorized_worker_pool.cc:360:11 (content_browsertests+0x00000440eafe)
    #32 RunTaskWithLockAcquired content/renderer/categorized_worker_pool.cc:338:7 (content_browsertests+0x00000440d413)
    #33 content::CategorizedWorkerPool::Run(std::__1::vector<cc::TaskCategory, std::__1::allocator<cc::TaskCategory> > const&, base::ConditionVariable*) content/renderer/categorized_worker_pool.cc:230 (content_browsertests+0x00000440d413)
    #34 content::(anonymous namespace)::CategorizedWorkerPoolThread::Run() content/renderer/categorized_worker_pool.cc:35:32 (content_browsertests+0x00000440ef6e)
    #35 base::SimpleThread::ThreadMain() base/threading/simple_thread.cc:68:3 (content_browsertests+0x000002cc5e22)
    #36 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (content_browsertests+0x000002cc0168)

  Location is global 'SkLineClipper::ClipLine(SkPoint const*, SkRect const&, SkPoint*, bool)::gOnce' of size 1 at 0x00000a4b2338 (content_browsertests+0x00000a4b2338)

  Thread T4 'CompositorTileW' (tid=15138, running) created by main thread at:
    #0 pthread_create <null> (content_browsertests+0x0000004b06f5)
    #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+0x000002cbfd05)
    #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:191:10 (content_browsertests+0x000002cbfbb5)
    #3 base::SimpleThread::Start() base/threading/simple_thread.cc:35:13 (content_browsertests+0x000002cc5b06)
    #4 content::CategorizedWorkerPool::Start(int) content/renderer/categorized_worker_pool.cc:142:13 (content_browsertests+0x00000440c154)
    #5 content::RenderThreadImpl::Init(scoped_refptr<base::SingleThreadTaskRunner>&) content/renderer/render_thread_impl.cc:847:29 (content_browsertests+0x00000428526a)
    #6 content::RenderThreadImpl::RenderThreadImpl(std::__1::unique_ptr<base::MessageLoop, std::__1::default_delete<base::MessageLoop> >, std::__1::unique_ptr<blink::scheduler::RendererScheduler, std::__1::default_delete<blink::scheduler::RendererScheduler> >) content/renderer/render_thread_impl.cc:615:3 (content_browsertests+0x0000042834ae)
    #7 content::RenderThreadImpl::Create(std::__1::unique_ptr<base::MessageLoop, std::__1::default_delete<base::MessageLoop> >, std::__1::unique_ptr<blink::scheduler::RendererScheduler, std::__1::default_delete<blink::scheduler::RendererScheduler> >) content/renderer/render_thread_impl.cc:578:14 (content_browsertests+0x000004283076)
    #8 content::RendererMain(content::MainFunctionParams const&) content/renderer/renderer_main.cc:186:5 (content_browsertests+0x0000042d192a)
    #9 content::RunZygote(content::MainFunctionParams const&, content::ContentMainDelegate*) content/app/content_main_runner.cc:343:14 (content_browsertests+0x000001f3c312)
    #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:426:12 (content_browsertests+0x000001f3d07d)
    #11 content::ContentMainRunnerImpl::Run() content/app/content_main_runner.cc:785:12 (content_browsertests+0x000001f3de5d)
    #12 content::ContentMain(content::ContentMainParams const&) content/app/content_main.cc:20:28 (content_browsertests+0x000001f33fce)
    #13 content::LaunchTests(content::TestLauncherDelegate*, int, int, char**) content/public/test/test_launcher.cc:523:12 (content_browsertests+0x0000027d5009)
    #14 main content/test/content_test_launcher.cc:131:10 (content_browsertests+0x0000027b79d2)

  Thread T5 'CompositorTileW' (tid=15140, running) created by main thread at:
    #0 pthread_create <null> (content_browsertests+0x0000004b06f5)
    #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+0x000002cbfd05)
    #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:191:10 (content_browsertests+0x000002cbfbb5)
    #3 base::SimpleThread::Start() base/threading/simple_thread.cc:35:13 (content_browsertests+0x000002cc5b06)
    #4 content::CategorizedWorkerPool::Start(int) content/renderer/categorized_worker_pool.cc:142:13 (content_browsertests+0x00000440c154)
    #5 content::RenderThreadImpl::Init(scoped_refptr<base::SingleThreadTaskRunner>&) content/renderer/render_thread_impl.cc:847:29 (content_browsertests+0x00000428526a)
    #6 content::RenderThreadImpl::RenderThreadImpl(std::__1::unique_ptr<base::MessageLoop, std::__1::default_delete<base::MessageLoop> >, std::__1::unique_ptr<blink::scheduler::RendererScheduler, std::__1::default_delete<blink::scheduler::RendererScheduler> >) content/renderer/render_thread_impl.cc:615:3 (content_browsertests+0x0000042834ae)
    #7 content::RenderThreadImpl::Create(std::__1::unique_ptr<base::MessageLoop, std::__1::default_delete<base::MessageLoop> >, std::__1::unique_ptr<blink::scheduler::RendererScheduler, std::__1::default_delete<blink::scheduler::RendererScheduler> >) content/renderer/render_thread_impl.cc:578:14 (content_browsertests+0x000004283076)
    #8 content::RendererMain(content::MainFunctionParams const&) content/renderer/renderer_main.cc:186:5 (content_browsertests+0x0000042d192a)
    #9 content::RunZygote(content::MainFunctionParams const&, content::ContentMainDelegate*) content/app/content_main_runner.cc:343:14 (content_browsertests+0x000001f3c312)
    #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:426:12 (content_browsertests+0x000001f3d07d)
    #11 content::ContentMainRunnerImpl::Run() content/app/content_main_runner.cc:785:12 (content_browsertests+0x000001f3de5d)
    #12 content::ContentMain(content::ContentMainParams const&) content/app/content_main.cc:20:28 (content_browsertests+0x000001f33fce)
    #13 content::LaunchTests(content::TestLauncherDelegate*, int, int, char**) content/public/test/test_launcher.cc:523:12 (content_browsertests+0x0000027d5009)
    #14 main content/test/content_test_launcher.cc:131:10 (content_browsertests+0x0000027b79d2)

SUMMARY: ThreadSanitizer: data race third_party/skia/src/core/SkLineClipper.cpp:176 in SkLineClipper::ClipLine(SkPoint const*, SkRect const&, SkPoint*, bool)
==================

Please remove gOnce and/or protect it with a mutex.
 

Comment 1 by reed@google.com, Aug 17 2016

Owner: reed@google.com
working fix: https://codereview.chromium.org/2250353004/

Comment 2 by glider@chromium.org, Aug 17 2016

Best turnaround ever!

Comment 3 by glider@chromium.org, Aug 17 2016

While you're at it, there's another problem with debugging code in SkPathStroker::conicStroke() in the same log (or shall I file a separate bug?)

Comment 4 by mtkl...@google.com, Aug 17 2016

This bot says it's a release build (linux_chromium_tsan_rel_ng).  How did it get down into code guarded by SK_DEBUG?

Until now we have never paid attention to thread safety in debug builds.  What's changed?

Comment 5 by glider@chromium.org, Aug 17 2016

Maybe the trybot (that's https://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_tsan_rel_ng) is misconfigured?
Do you know which GN flag enables the debug builds?

Comment 6 by mtkl...@google.com, Aug 17 2016

Presumably, is_debug?

Comment 7 by mtkl...@google.com, Aug 17 2016

Ah,

dcheck_always_on = true
enable_nacl = false
goma_dir = "/b/c/cipd/goma"
is_component_build = false
is_debug = false
is_tsan = true
symbol_level = 1
use_goma = true

dcheck_always_on = true, is_debug = false

People call this Release with dchecks, but it's really, Debug with optimization.  I think dcheck_always_on sets SK_DEBUG, which controls all our asserts and any other validation code guarded by SK_DEBUG (most of which exists to feed into an assert).

So it looks like we now need to make all our SK_DEBUG code threadsafe.
Cc: mtkl...@google.com

Comment 9 by glider@chromium.org, Aug 17 2016

It's still a good idea if you want the debug code to work predictably :)

Comment 10 by reed@google.com, Aug 17 2016

agreed. though in this case, the global guard was just a modest perf hint, to not run a test too many times. reliability was not in question.
Looks like std::atomic is allowed in Skia. In this case this is just a matter of making the variable atomic and accessing it with std::memory_order_relaxed.

Comment 12 by mtkl...@google.com, Aug 17 2016

Thanks.  I think we've got a fairly good handle on how to make these things threadsafe.  It's mostly that we (at least, I) just don't want to.

There's a fairly high activation energy to overcome here to convince people that threads really exist and thread-safety in debug code matters, and a bunch of old crusty code to clean up.
Well, not much of the debug code is actually executed under TSan, at least now. So we can probably leave the rest as is, till it fires up.
Another option is to convince ourselves that we don't want to run SK_DEBUG under TSan at all and disable it completely.
Project Member

Comment 15 by bugdroid1@chromium.org, Aug 17 2016

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

commit 027e883cead37b26a4cdc14a1b6b30659091200b
Author: skia-deps-roller <skia-deps-roller@chromium.org>
Date: Wed Aug 17 15:40:14 2016

Roll src/third_party/skia/ bf63e616a..ff863bc55 (1 commit).

https://chromium.googlesource.com/skia.git/+log/bf63e616a67e..ff863bc550a8

$ git log bf63e616a..ff863bc55 --date=short --no-merges --format='%ad %ae %s'
2016-08-17 reed move private test for sect_with_horizontal into unittests

BUG= 638575 

CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_precise_blink_rel
TBR=robertphillips@google.com

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

[modify] https://crrev.com/027e883cead37b26a4cdc14a1b6b30659091200b/DEPS

Components: Internals>Skia
Owner: reed@chromium.org
Owner: reed@google.com
Status: Fixed (was: Assigned)
Fixed way back with those CLs in 2016.  There is no more gOnce in SkLineClipper.cpp.

Sign in to add a comment