Title: [218944] trunk/Source/WebCore
Revision
218944
Author
[email protected]
Date
2017-06-29 10:58:30 -0700 (Thu, 29 Jun 2017)

Log Message

Avoid copying ResourceLoadStatistics objects
https://bugs.webkit.org/show_bug.cgi?id=173972

Reviewed by Geoffrey Garen.

Avoid copying ResourceLoadStatistics objects given that they are big. Make the type move-only
to avoid such mistakes in the future.

* loader/ResourceLoadObserver.cpp:
(WebCore::ResourceLoadObserver::logFrameNavigation):
* loader/ResourceLoadStatistics.h:
(WebCore::ResourceLoadStatistics::ResourceLoadStatistics):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (218943 => 218944)


--- trunk/Source/WebCore/ChangeLog	2017-06-29 17:54:32 UTC (rev 218943)
+++ trunk/Source/WebCore/ChangeLog	2017-06-29 17:58:30 UTC (rev 218944)
@@ -1,3 +1,18 @@
+2017-06-29  Chris Dumez  <[email protected]>
+
+        Avoid copying ResourceLoadStatistics objects
+        https://bugs.webkit.org/show_bug.cgi?id=173972
+
+        Reviewed by Geoffrey Garen.
+
+        Avoid copying ResourceLoadStatistics objects given that they are big. Make the type move-only
+        to avoid such mistakes in the future.
+
+        * loader/ResourceLoadObserver.cpp:
+        (WebCore::ResourceLoadObserver::logFrameNavigation):
+        * loader/ResourceLoadStatistics.h:
+        (WebCore::ResourceLoadStatistics::ResourceLoadStatistics):
+
 2017-06-29  Antoine Quint  <[email protected]>
 
         Full stop shows to the right of the picture-in-picture localised string in Hebrew

Modified: trunk/Source/WebCore/loader/ResourceLoadObserver.cpp (218943 => 218944)


--- trunk/Source/WebCore/loader/ResourceLoadObserver.cpp	2017-06-29 17:54:32 UTC (rev 218943)
+++ trunk/Source/WebCore/loader/ResourceLoadObserver.cpp	2017-06-29 17:58:30 UTC (rev 218944)
@@ -150,59 +150,58 @@
         bool shouldFireDataModificationHandler = false;
         
         {
-        auto locker = holdLock(m_store->statisticsLock());
-        // We must make a copy here, because later calls to 'ensureResourceStatisticsForPrimaryDomain' will invalidate the returned reference:
-        auto targetStatistics = m_store->ensureResourceStatisticsForPrimaryDomain(targetPrimaryDomain);
+            auto locker = holdLock(m_store->statisticsLock());
+            ResourceLoadStatistics targetStatistics(targetPrimaryDomain);
 
-        // Always fire if we have previously removed data records for this domain
-        shouldFireDataModificationHandler = targetStatistics.dataRecordsRemoved > 0;
+            // Always fire if we have previously removed data records for this domain
+            shouldFireDataModificationHandler = targetStatistics.dataRecordsRemoved > 0;
 
-        if (isMainFrame)
-            targetStatistics.topFrameHasBeenNavigatedToBefore = true;
-        else {
-            targetStatistics.subframeHasBeenLoadedBefore = true;
+            if (isMainFrame)
+                targetStatistics.topFrameHasBeenNavigatedToBefore = true;
+            else {
+                targetStatistics.subframeHasBeenLoadedBefore = true;
 
-            auto subframeUnderTopFrameOriginsResult = targetStatistics.subframeUnderTopFrameOrigins.add(mainFramePrimaryDomain);
-            if (subframeUnderTopFrameOriginsResult.isNewEntry)
-                shouldFireDataModificationHandler = true;
-        }
-        
-        if (isRedirect) {
-            auto& redirectingOriginResourceStatistics = m_store->ensureResourceStatisticsForPrimaryDomain(sourcePrimaryDomain);
-            
-            if (m_store->isPrevalentResource(targetPrimaryDomain))
-                redirectingOriginResourceStatistics.redirectedToOtherPrevalentResourceOrigins.add(targetPrimaryDomain);
-            
-            if (isMainFrame) {
-                ++targetStatistics.topFrameHasBeenRedirectedTo;
-                ++redirectingOriginResourceStatistics.topFrameHasBeenRedirectedFrom;
-            } else {
-                ++targetStatistics.subframeHasBeenRedirectedTo;
-                ++redirectingOriginResourceStatistics.subframeHasBeenRedirectedFrom;
-                redirectingOriginResourceStatistics.subframeUniqueRedirectsTo.add(targetPrimaryDomain);
-                
-                ++targetStatistics.subframeSubResourceCount;
+                auto subframeUnderTopFrameOriginsResult = targetStatistics.subframeUnderTopFrameOrigins.add(mainFramePrimaryDomain);
+                if (subframeUnderTopFrameOriginsResult.isNewEntry)
+                    shouldFireDataModificationHandler = true;
             }
-        } else {
-            if (sourcePrimaryDomain.isNull() || sourcePrimaryDomain.isEmpty() || sourcePrimaryDomain == "nullOrigin") {
-                if (isMainFrame)
-                    ++targetStatistics.topFrameInitialLoadCount;
-                else
-                    ++targetStatistics.subframeSubResourceCount;
-            } else {
-                auto& sourceOriginResourceStatistics = m_store->ensureResourceStatisticsForPrimaryDomain(sourcePrimaryDomain);
 
+            if (isRedirect) {
+                auto& redirectingOriginResourceStatistics = m_store->ensureResourceStatisticsForPrimaryDomain(sourcePrimaryDomain);
+
+                if (m_store->isPrevalentResource(targetPrimaryDomain))
+                    redirectingOriginResourceStatistics.redirectedToOtherPrevalentResourceOrigins.add(targetPrimaryDomain);
+
                 if (isMainFrame) {
-                    ++sourceOriginResourceStatistics.topFrameHasBeenNavigatedFrom;
-                    ++targetStatistics.topFrameHasBeenNavigatedTo;
+                    ++targetStatistics.topFrameHasBeenRedirectedTo;
+                    ++redirectingOriginResourceStatistics.topFrameHasBeenRedirectedFrom;
                 } else {
-                    ++sourceOriginResourceStatistics.subframeHasBeenNavigatedFrom;
-                    ++targetStatistics.subframeHasBeenNavigatedTo;
+                    ++targetStatistics.subframeHasBeenRedirectedTo;
+                    ++redirectingOriginResourceStatistics.subframeHasBeenRedirectedFrom;
+                    redirectingOriginResourceStatistics.subframeUniqueRedirectsTo.add(targetPrimaryDomain);
+
+                    ++targetStatistics.subframeSubResourceCount;
                 }
+            } else {
+                if (sourcePrimaryDomain.isNull() || sourcePrimaryDomain.isEmpty() || sourcePrimaryDomain == "nullOrigin") {
+                    if (isMainFrame)
+                        ++targetStatistics.topFrameInitialLoadCount;
+                    else
+                        ++targetStatistics.subframeSubResourceCount;
+                } else {
+                    auto& sourceOriginResourceStatistics = m_store->ensureResourceStatisticsForPrimaryDomain(sourcePrimaryDomain);
+
+                    if (isMainFrame) {
+                        ++sourceOriginResourceStatistics.topFrameHasBeenNavigatedFrom;
+                        ++targetStatistics.topFrameHasBeenNavigatedTo;
+                    } else {
+                        ++sourceOriginResourceStatistics.subframeHasBeenNavigatedFrom;
+                        ++targetStatistics.subframeHasBeenNavigatedTo;
+                    }
+                }
             }
-        }
-            
-        m_store->setResourceStatisticsForPrimaryDomain(targetPrimaryDomain, WTFMove(targetStatistics));
+
+            m_store->setResourceStatisticsForPrimaryDomain(targetPrimaryDomain, WTFMove(targetStatistics));
         } // Release lock
         
         if (shouldFireDataModificationHandler)

Modified: trunk/Source/WebCore/loader/ResourceLoadStatistics.h (218943 => 218944)


--- trunk/Source/WebCore/loader/ResourceLoadStatistics.h	2017-06-29 17:54:32 UTC (rev 218943)
+++ trunk/Source/WebCore/loader/ResourceLoadStatistics.h	2017-06-29 17:58:30 UTC (rev 218944)
@@ -36,7 +36,7 @@
 class KeyedEncoder;
 
 struct ResourceLoadStatistics {
-    ResourceLoadStatistics(const String& primaryDomain)
+    explicit ResourceLoadStatistics(const String& primaryDomain)
         : highLevelDomain(primaryDomain)
     {
     }
@@ -43,6 +43,11 @@
 
     ResourceLoadStatistics() = default;
 
+    ResourceLoadStatistics(const ResourceLoadStatistics&) = delete;
+    ResourceLoadStatistics& operator=(const ResourceLoadStatistics&) = delete;
+    ResourceLoadStatistics(ResourceLoadStatistics&&) = default;
+    ResourceLoadStatistics& operator=(ResourceLoadStatistics&&) = default;
+
     void encode(KeyedEncoder&) const;
     bool decode(KeyedDecoder&, unsigned version);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to