Commit dbc43f5e authored by Lucas Gadani's avatar Lucas Gadani Committed by Commit Bot

Store PendingInvalidations directly in the map.

This avoids doing memory allocations for every single node added to
the map.

Change-Id: Id7dd638e292c09180db3435285ce6d0a24ddc838
Reviewed-on: https://chromium-review.googlesource.com/962347
Commit-Queue: Lucas Gadani <lfg@chromium.org>
Reviewed-by: default avatarAlan Cutter <alancutter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#544139}
parent a14e537d
...@@ -13,6 +13,8 @@ namespace blink { ...@@ -13,6 +13,8 @@ namespace blink {
class CORE_EXPORT PendingInvalidations final { class CORE_EXPORT PendingInvalidations final {
public: public:
PendingInvalidations() = default; PendingInvalidations() = default;
PendingInvalidations(PendingInvalidations&&) = default;
PendingInvalidations& operator=(PendingInvalidations&&) = default;
InvalidationSetVector& Descendants() { return descendants_; } InvalidationSetVector& Descendants() { return descendants_; }
const InvalidationSetVector& Descendants() const { return descendants_; } const InvalidationSetVector& Descendants() const { return descendants_; }
......
...@@ -138,13 +138,16 @@ void StyleInvalidator::ScheduleSiblingInvalidationsAsDescendants( ...@@ -138,13 +138,16 @@ void StyleInvalidator::ScheduleSiblingInvalidationsAsDescendants(
void StyleInvalidator::RescheduleSiblingInvalidationsAsDescendants( void StyleInvalidator::RescheduleSiblingInvalidationsAsDescendants(
Element& element) { Element& element) {
DCHECK(element.parentNode()); DCHECK(element.parentNode());
PendingInvalidations* pending_invalidations = auto pending_invalidations_iterator =
pending_invalidation_map_.at(&element); pending_invalidation_map_.find(&element);
if (!pending_invalidations || pending_invalidations->Siblings().IsEmpty()) if (pending_invalidations_iterator == pending_invalidation_map_.end() ||
pending_invalidations_iterator->value.Siblings().IsEmpty())
return; return;
PendingInvalidations& pending_invalidations =
pending_invalidations_iterator->value;
InvalidationLists invalidation_lists; InvalidationLists invalidation_lists;
for (const auto& invalidation_set : pending_invalidations->Siblings()) { for (const auto& invalidation_set : pending_invalidations.Siblings()) {
invalidation_lists.descendants.push_back(invalidation_set); invalidation_lists.descendants.push_back(invalidation_set);
if (DescendantInvalidationSet* descendants = if (DescendantInvalidationSet* descendants =
ToSiblingInvalidationSet(*invalidation_set).SiblingDescendants()) { ToSiblingInvalidationSet(*invalidation_set).SiblingDescendants()) {
...@@ -163,11 +166,12 @@ void StyleInvalidator::ClearInvalidation(ContainerNode& node) { ...@@ -163,11 +166,12 @@ void StyleInvalidator::ClearInvalidation(ContainerNode& node) {
PendingInvalidations& StyleInvalidator::EnsurePendingInvalidations( PendingInvalidations& StyleInvalidator::EnsurePendingInvalidations(
ContainerNode& node) { ContainerNode& node) {
auto it = pending_invalidation_map_.find(&node);
if (it != pending_invalidation_map_.end())
return it->value;
PendingInvalidationMap::AddResult add_result = PendingInvalidationMap::AddResult add_result =
pending_invalidation_map_.insert(&node, nullptr); pending_invalidation_map_.insert(&node, PendingInvalidations());
if (add_result.is_new_entry) return add_result.stored_value->value;
add_result.stored_value->value = std::make_unique<PendingInvalidations>();
return *add_result.stored_value->value;
} }
StyleInvalidator::StyleInvalidator() { StyleInvalidator::StyleInvalidator() {
...@@ -284,11 +288,12 @@ void StyleInvalidator::PushInvalidationSetsForContainerNode( ...@@ -284,11 +288,12 @@ void StyleInvalidator::PushInvalidationSetsForContainerNode(
ContainerNode& node, ContainerNode& node,
RecursionData& recursion_data, RecursionData& recursion_data,
SiblingData& sibling_data) { SiblingData& sibling_data) {
PendingInvalidations* pending_invalidations = auto pending_invalidations_iterator = pending_invalidation_map_.find(&node);
pending_invalidation_map_.at(&node); DCHECK(pending_invalidations_iterator != pending_invalidation_map_.end());
DCHECK(pending_invalidations); PendingInvalidations& pending_invalidations =
pending_invalidations_iterator->value;
for (const auto& invalidation_set : pending_invalidations->Siblings()) { for (const auto& invalidation_set : pending_invalidations.Siblings()) {
CHECK(invalidation_set->IsAlive()); CHECK(invalidation_set->IsAlive());
sibling_data.PushInvalidationSet( sibling_data.PushInvalidationSet(
ToSiblingInvalidationSet(*invalidation_set)); ToSiblingInvalidationSet(*invalidation_set));
...@@ -297,8 +302,8 @@ void StyleInvalidator::PushInvalidationSetsForContainerNode( ...@@ -297,8 +302,8 @@ void StyleInvalidator::PushInvalidationSetsForContainerNode(
if (node.GetStyleChangeType() >= kSubtreeStyleChange) if (node.GetStyleChangeType() >= kSubtreeStyleChange)
return; return;
if (!pending_invalidations->Descendants().IsEmpty()) { if (!pending_invalidations.Descendants().IsEmpty()) {
for (const auto& invalidation_set : pending_invalidations->Descendants()) { for (const auto& invalidation_set : pending_invalidations.Descendants()) {
CHECK(invalidation_set->IsAlive()); CHECK(invalidation_set->IsAlive());
recursion_data.PushInvalidationSet(*invalidation_set); recursion_data.PushInvalidationSet(*invalidation_set);
} }
...@@ -308,7 +313,7 @@ void StyleInvalidator::PushInvalidationSetsForContainerNode( ...@@ -308,7 +313,7 @@ void StyleInvalidator::PushInvalidationSetsForContainerNode(
"StyleInvalidatorInvalidationTracking", TRACE_EVENT_SCOPE_THREAD, "StyleInvalidatorInvalidationTracking", TRACE_EVENT_SCOPE_THREAD,
"data", "data",
InspectorStyleInvalidatorInvalidateEvent::InvalidationList( InspectorStyleInvalidatorInvalidateEvent::InvalidationList(
node, pending_invalidations->Descendants())); node, pending_invalidations.Descendants()));
} }
} }
} }
......
...@@ -185,7 +185,7 @@ class CORE_EXPORT StyleInvalidator { ...@@ -185,7 +185,7 @@ class CORE_EXPORT StyleInvalidator {
}; };
using PendingInvalidationMap = using PendingInvalidationMap =
HeapHashMap<Member<ContainerNode>, std::unique_ptr<PendingInvalidations>>; HeapHashMap<Member<ContainerNode>, PendingInvalidations>;
PendingInvalidations& EnsurePendingInvalidations(ContainerNode&); PendingInvalidations& EnsurePendingInvalidations(ContainerNode&);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment