AX: Do less work under m_changeLogLock in AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
https://bugs.webkit.org/show_bug.cgi?id=235624
Reviewed by Chris Fleizach.
AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
do work while holding m_changeLogLock that does not require this lock. This
patch moves this work before the lock acquisition so we hold the lock for as short
a time as possible.
* accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::clear):
(WebCore::AXIsolatedTree::setFocusedNodeID):
Move work that doesn't require m_changeLogLock before we acquire the lock.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@288619 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index eea6aed..0b90311 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,20 @@
+2022-01-26 Tyler Wilcock <tyler_w@apple.com>
+
+ AX: Do less work under m_changeLogLock in AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
+ https://bugs.webkit.org/show_bug.cgi?id=235624
+
+ Reviewed by Chris Fleizach.
+
+ AXIsolatedTree::clear and AXIsolatedTree::setFocusedNodeID
+ do work while holding m_changeLogLock that does not require this lock. This
+ patch moves this work before the lock acquisition so we hold the lock for as short
+ a time as possible.
+
+ * accessibility/isolatedtree/AXIsolatedTree.cpp:
+ (WebCore::AXIsolatedTree::clear):
+ (WebCore::AXIsolatedTree::setFocusedNodeID):
+ Move work that doesn't require m_changeLogLock before we acquire the lock.
+
2022-01-26 Antti Koivisto <antti@apple.com>
ASSERTION FAILED: !hasPendingSheets() under WebCore::Style::Scope::~Scope()
diff --git a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
index 6549dbb..03ad3df 100644
--- a/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
+++ b/Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
@@ -76,11 +76,11 @@
AXTRACE("AXIsolatedTree::clear");
ASSERT(isMainThread());
m_axObjectCache = nullptr;
+ m_nodeMap.clear();
Locker locker { m_changeLogLock };
m_pendingSubtreeRemovals.append(m_rootNode->objectID());
m_rootNode = nullptr;
- m_nodeMap.clear();
}
RefPtr<AXIsolatedTree> AXIsolatedTree::treeForID(AXIsolatedTreeID treeID)
@@ -431,11 +431,11 @@
AXLOG(makeString("axID ", axID.loggingString()));
ASSERT(isMainThread());
- Locker locker { m_changeLogLock };
- m_pendingFocusedNodeID = axID;
-
AXPropertyMap propertyMap;
propertyMap.set(AXPropertyName::IsFocused, true);
+
+ Locker locker { m_changeLogLock };
+ m_pendingFocusedNodeID = axID;
m_pendingPropertyChanges.append({ axID, propertyMap });
}