Data race on gOnce in SkLineClipper.cpp |
||||||
Issue descriptionNoticed 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.
,
Aug 17 2016
Best turnaround ever!
,
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?)
,
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?
,
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?
,
Aug 17 2016
Presumably, is_debug?
,
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.
,
Aug 17 2016
,
Aug 17 2016
It's still a good idea if you want the debug code to work predictably :)
,
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.
,
Aug 17 2016
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.
,
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.
,
Aug 17 2016
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.
,
Aug 17 2016
The following revision refers to this bug: https://skia.googlesource.com/skia.git/+/ff863bc550a8738c9c2667be225e653636617a90 commit ff863bc550a8738c9c2667be225e653636617a90 Author: reed <reed@google.com> Date: Wed Aug 17 14:37:57 2016 move private test for sect_with_horizontal into unittests BUG= 638575 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2250353004 Review-Url: https://codereview.chromium.org/2250353004 [modify] https://crrev.com/ff863bc550a8738c9c2667be225e653636617a90/src/core/SkLineClipper.cpp [modify] https://crrev.com/ff863bc550a8738c9c2667be225e653636617a90/tests/PathTest.cpp
,
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
,
Aug 30 2016
,
Aug 2
,
Jan 16
,
Jan 16
Fixed way back with those CLs in 2016. There is no more gOnce in SkLineClipper.cpp. |
||||||
►
Sign in to add a comment |
||||||
Comment 1 by reed@google.com
, Aug 17 2016