Changeset 260716 in webkit
- Timestamp:
- Apr 25, 2020 6:24:03 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r260714 r260716 1 2020-04-25 Simon Fraser <simon.fraser@apple.com> 2 3 Commit the scrolling tree from the main thread 4 https://bugs.webkit.org/show_bug.cgi?id=211026 5 <rdar://problem/62374855> 6 7 Reviewed by Darin Adler. 8 9 ScrollingCoordinatorMac::commitTreeStateIfNeeded() passed the new state tree to 10 the scrolling thread which then did the commit (which updates the scrolling tree 11 from the state tree). However, applyLayerPositions() immediately waited for that 12 commit to complete, blocking the main thread anyway. 13 14 We might as well just commit the scrolling tree on the main thread. ScrollingTree::commitTreeState() 15 locks m_treeMutex, so this is still safe. Lock contention with the scrolling or event dispatcher 16 threads should be rare; those threads are both mostly responsive. 17 18 * page/scrolling/AsyncScrollingCoordinator.cpp: 19 (WebCore::AsyncScrollingCoordinator::scrollingTreeAsText const): 20 * page/scrolling/ScrollingTree.cpp: 21 (WebCore::ScrollingTree::commitTreeState): 22 * page/scrolling/ScrollingTree.h: 23 (WebCore::ScrollingTree::waitForScrollingTreeCommit): Deleted. 24 * page/scrolling/ThreadedScrollingTree.cpp: 25 (WebCore::ThreadedScrollingTree::commitTreeState): Deleted. 26 (WebCore::ThreadedScrollingTree::incrementPendingCommitCount): Deleted. 27 (WebCore::ThreadedScrollingTree::decrementPendingCommitCount): Deleted. 28 (WebCore::ThreadedScrollingTree::waitForPendingCommits): Deleted. 29 (WebCore::ThreadedScrollingTree::waitForScrollingTreeCommit): Deleted. 30 (WebCore::ThreadedScrollingTree::applyLayerPositions): Deleted. 31 * page/scrolling/ThreadedScrollingTree.h: 32 * page/scrolling/mac/ScrollingCoordinatorMac.mm: 33 (WebCore::ScrollingCoordinatorMac::commitTreeStateIfNeeded): 34 * page/scrolling/nicosia/ScrollingCoordinatorNicosia.cpp: 35 (WebCore::ScrollingCoordinatorNicosia::commitTreeState): 36 1 37 2020-04-25 Yusuke Suzuki <ysuzuki@apple.com> 2 38 -
trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp
r260557 r260716 854 854 return emptyString(); 855 855 856 m_scrollingTree->waitForScrollingTreeCommit();857 856 return m_scrollingTree->scrollingTreeAsText(behavior); 858 857 } -
trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp
r260571 r260716 192 192 } 193 193 194 void ScrollingTree::commitTreeState(std::unique_ptr<ScrollingStateTree> scrollingStateTree)194 void ScrollingTree::commitTreeState(std::unique_ptr<ScrollingStateTree>&& scrollingStateTree) 195 195 { 196 196 SetForScope<bool> inCommitTreeState(m_inCommitTreeState, true); -
trunk/Source/WebCore/page/scrolling/ScrollingTree.h
r260571 r260716 79 79 80 80 virtual void invalidate() { } 81 WEBCORE_EXPORT virtual void commitTreeState(std::unique_ptr<ScrollingStateTree> );81 WEBCORE_EXPORT virtual void commitTreeState(std::unique_ptr<ScrollingStateTree>&&); 82 82 83 83 WEBCORE_EXPORT virtual void applyLayerPositions(); … … 174 174 virtual void lockLayersForHitTesting() { } 175 175 virtual void unlockLayersForHitTesting() { } 176 177 virtual void waitForScrollingTreeCommit() { }178 176 179 177 protected: -
trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp
r260199 r260716 86 86 } 87 87 88 void ThreadedScrollingTree::commitTreeState(std::unique_ptr<ScrollingStateTree> scrollingStateTree)89 {90 ASSERT(ScrollingThread::isCurrentThread());91 ScrollingTree::commitTreeState(WTFMove(scrollingStateTree));92 93 decrementPendingCommitCount();94 }95 96 88 void ThreadedScrollingTree::propagateSynchronousScrollingReasons(const HashSet<ScrollingNodeID>& synchronousScrollingNodes) 97 89 { … … 161 153 } 162 154 163 void ThreadedScrollingTree::incrementPendingCommitCount()164 {165 LockHolder commitLocker(m_pendingCommitCountMutex);166 ++m_pendingCommitCount;167 }168 169 void ThreadedScrollingTree::decrementPendingCommitCount()170 {171 LockHolder commitLocker(m_pendingCommitCountMutex);172 ASSERT(m_pendingCommitCount > 0);173 if (!--m_pendingCommitCount)174 m_commitCondition.notifyOne();175 }176 177 void ThreadedScrollingTree::waitForPendingCommits()178 {179 ASSERT(isMainThread());180 181 LockHolder commitLocker(m_pendingCommitCountMutex);182 while (m_pendingCommitCount)183 m_commitCondition.wait(m_pendingCommitCountMutex);184 }185 186 void ThreadedScrollingTree::waitForScrollingTreeCommit()187 {188 waitForPendingCommits();189 }190 191 void ThreadedScrollingTree::applyLayerPositions()192 {193 waitForPendingCommits();194 ScrollingTree::applyLayerPositions();195 }196 197 155 #if PLATFORM(COCOA) 198 156 void ThreadedScrollingTree::currentSnapPointIndicesDidChange(ScrollingNodeID nodeID, unsigned horizontal, unsigned vertical) -
trunk/Source/WebCore/page/scrolling/ThreadedScrollingTree.h
r260190 r260716 45 45 virtual ~ThreadedScrollingTree(); 46 46 47 void commitTreeState(std::unique_ptr<ScrollingStateTree>) override;48 49 47 ScrollingEventResult handleWheelEvent(const PlatformWheelEvent&) override; 50 48 … … 55 53 56 54 void invalidate() override; 57 58 void incrementPendingCommitCount();59 void decrementPendingCommitCount();60 55 61 56 protected: … … 78 73 private: 79 74 bool isThreadedScrollingTree() const override { return true; } 80 void applyLayerPositions() override;81 void waitForScrollingTreeCommit() override;82 75 void propagateSynchronousScrollingReasons(const HashSet<ScrollingNodeID>&) override; 83 76 84 77 RefPtr<AsyncScrollingCoordinator> m_scrollingCoordinator; 85 86 void waitForPendingCommits();87 88 Lock m_pendingCommitCountMutex;89 unsigned m_pendingCommitCount { 0 };90 Condition m_commitCondition;91 78 }; 92 79 -
trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm
r260366 r260716 98 98 willCommitTree(); 99 99 100 LOG (Scrolling, "ScrollingCoordinatorMac::commitTreeState, has changes %d",scrollingStateTree()->hasChangedProperties());100 LOG_WITH_STREAM(Scrolling, stream << "ScrollingCoordinatorMac::commitTreeState, has changes " << scrollingStateTree()->hasChangedProperties()); 101 101 102 102 if (!scrollingStateTree()->hasChangedProperties()) 103 103 return; 104 104 105 LOG (Scrolling, "%s", scrollingStateTreeAsText(ScrollingStateTreeAsTextBehaviorDebug).utf8().data());105 LOG_WITH_STREAM(Scrolling, stream << scrollingStateTreeAsText(ScrollingStateTreeAsTextBehaviorDebug)); 106 106 107 RefPtr<ThreadedScrollingTree> threadedScrollingTree = downcast<ThreadedScrollingTree>(scrollingTree()); 108 ScrollingStateTree* unprotectedTreeState = scrollingStateTree()->commit(LayerRepresentation::PlatformLayerRepresentation).release(); 109 110 threadedScrollingTree->incrementPendingCommitCount(); 111 112 ScrollingThread::dispatch([threadedScrollingTree, unprotectedTreeState] { 113 std::unique_ptr<ScrollingStateTree> treeState(unprotectedTreeState); 114 threadedScrollingTree->commitTreeState(WTFMove(treeState)); 115 }); 107 auto stateTree = scrollingStateTree()->commit(LayerRepresentation::PlatformLayerRepresentation); 108 scrollingTree()->commitTreeState(WTFMove(stateTree)); 116 109 117 110 updateTiledScrollingIndicator(); -
trunk/Source/WebCore/page/scrolling/nicosia/ScrollingCoordinatorNicosia.cpp
r250419 r260716 95 95 return; 96 96 97 RefPtr<ThreadedScrollingTree> threadedScrollingTree = downcast<ThreadedScrollingTree>(scrollingTree()); 98 threadedScrollingTree->incrementPendingCommitCount(); 99 100 auto treeState = scrollingStateTree()->commit(LayerRepresentation::PlatformLayerRepresentation); 101 ScrollingThread::dispatch([threadedScrollingTree, treeState = WTFMove(treeState)]() mutable { 102 threadedScrollingTree->commitTreeState(WTFMove(treeState)); 103 }); 97 auto stateTree = scrollingStateTree()->commit(LayerRepresentation::PlatformLayerRepresentation); 98 scrollingTree()->commitTreeState(WTFMove(stateTree)); 104 99 } 105 100
Note: See TracChangeset
for help on using the changeset viewer.