Title: [182335] trunk/Source/WebCore
Revision
182335
Author
achristen...@apple.com
Date
2015-04-03 14:44:41 -0700 (Fri, 03 Apr 2015)

Log Message

[Content Extensions] Add memory reporting.
https://bugs.webkit.org/show_bug.cgi?id=143386

Reviewed by Benjamin Poulain.

* contentextensions/CompiledContentExtension.cpp:
(WebCore::ContentExtensions::CompiledContentExtension::globalDisplayNoneSelectors):
* contentextensions/CompiledContentExtension.h:
* contentextensions/ContentExtension.cpp:
(WebCore::ContentExtensions::ContentExtension::globalDisplayNoneStyleSheet):
* contentextensions/ContentExtension.h:
* contentextensions/ContentExtensionsBackend.cpp:
(WebCore::ContentExtensions::ContentExtensionsBackend::actionsForResourceLoad):
* contentextensions/ContentExtensionsDebugging.h:
* contentextensions/DFABytecodeInterpreter.cpp:
(WebCore::ContentExtensions::getBits):
(WebCore::ContentExtensions::DFABytecodeInterpreter::interpretAppendAction):
(WebCore::ContentExtensions::DFABytecodeInterpreter::interpretTestFlagsAndAppendAction):
(WebCore::ContentExtensions::DFABytecodeInterpreter::actionsFromDFARoot):
(WebCore::ContentExtensions::DFABytecodeInterpreter::interpret):
* contentextensions/DFABytecodeInterpreter.h:
(WebCore::ContentExtensions::DFABytecodeInterpreter::DFABytecodeInterpreter):
(WebCore::ContentExtensions::DFABytecodeInterpreter::~DFABytecodeInterpreter):
Keep track of which memory pages in the bytecode are being hit if CONTENT_EXTENSIONS_MEMORY_REPORTING is 1.
When CONTENT_EXTENSIONS_MEMORY_REPORTING is 0, this makes an empty vector in ContentExtension
and passes some pointers on the stack, many of which can be optimized out by the C++ compiler.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (182334 => 182335)


--- trunk/Source/WebCore/ChangeLog	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/ChangeLog	2015-04-03 21:44:41 UTC (rev 182335)
@@ -1,3 +1,32 @@
+2015-04-03  Alex Christensen  <achristen...@webkit.org>
+
+        [Content Extensions] Add memory reporting.
+        https://bugs.webkit.org/show_bug.cgi?id=143386
+
+        Reviewed by Benjamin Poulain.
+
+        * contentextensions/CompiledContentExtension.cpp:
+        (WebCore::ContentExtensions::CompiledContentExtension::globalDisplayNoneSelectors):
+        * contentextensions/CompiledContentExtension.h:
+        * contentextensions/ContentExtension.cpp:
+        (WebCore::ContentExtensions::ContentExtension::globalDisplayNoneStyleSheet):
+        * contentextensions/ContentExtension.h:
+        * contentextensions/ContentExtensionsBackend.cpp:
+        (WebCore::ContentExtensions::ContentExtensionsBackend::actionsForResourceLoad):
+        * contentextensions/ContentExtensionsDebugging.h:
+        * contentextensions/DFABytecodeInterpreter.cpp:
+        (WebCore::ContentExtensions::getBits):
+        (WebCore::ContentExtensions::DFABytecodeInterpreter::interpretAppendAction):
+        (WebCore::ContentExtensions::DFABytecodeInterpreter::interpretTestFlagsAndAppendAction):
+        (WebCore::ContentExtensions::DFABytecodeInterpreter::actionsFromDFARoot):
+        (WebCore::ContentExtensions::DFABytecodeInterpreter::interpret):
+        * contentextensions/DFABytecodeInterpreter.h:
+        (WebCore::ContentExtensions::DFABytecodeInterpreter::DFABytecodeInterpreter):
+        (WebCore::ContentExtensions::DFABytecodeInterpreter::~DFABytecodeInterpreter):
+        Keep track of which memory pages in the bytecode are being hit if CONTENT_EXTENSIONS_MEMORY_REPORTING is 1.
+        When CONTENT_EXTENSIONS_MEMORY_REPORTING is 0, this makes an empty vector in ContentExtension
+        and passes some pointers on the stack, many of which can be optimized out by the C++ compiler.
+
 2015-04-03  Brent Fulgham  <bfulg...@apple.com>
 
         Expand test infrastructure to support scrolling tests

Modified: trunk/Source/WebCore/contentextensions/CompiledContentExtension.cpp (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/CompiledContentExtension.cpp	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/CompiledContentExtension.cpp	2015-04-03 21:44:41 UTC (rev 182335)
@@ -36,9 +36,9 @@
 {
 }
 
-Vector<String> CompiledContentExtension::globalDisplayNoneSelectors()
+Vector<String> CompiledContentExtension::globalDisplayNoneSelectors(Vector<bool>& pagesUsed)
 {
-    DFABytecodeInterpreter interpreter(bytecode(), bytecodeLength());
+    DFABytecodeInterpreter interpreter(bytecode(), bytecodeLength(), pagesUsed);
     DFABytecodeInterpreter::Actions actionLocations = interpreter.actionsFromDFARoot();
     
     Vector<Action> globalActions;

Modified: trunk/Source/WebCore/contentextensions/CompiledContentExtension.h (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/CompiledContentExtension.h	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/CompiledContentExtension.h	2015-04-03 21:44:41 UTC (rev 182335)
@@ -44,7 +44,7 @@
     virtual unsigned bytecodeLength() const = 0;
     virtual const SerializedActionByte* actions() const = 0;
     virtual unsigned actionsLength() const = 0;
-    Vector<String> globalDisplayNoneSelectors();
+    Vector<String> globalDisplayNoneSelectors(Vector<bool>& pagesUsed);
 };
 
 } // namespace ContentExtensions

Modified: trunk/Source/WebCore/contentextensions/ContentExtension.cpp (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/ContentExtension.cpp	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/ContentExtension.cpp	2015-04-03 21:44:41 UTC (rev 182335)
@@ -55,7 +55,7 @@
 
     m_parsedGlobalDisplayNoneStyleSheet = true;
 
-    Vector<String> selectors = m_compiledExtension->globalDisplayNoneSelectors();
+    Vector<String> selectors = m_compiledExtension->globalDisplayNoneSelectors(m_pagesUsed);
     if (selectors.isEmpty())
         return nullptr;
 

Modified: trunk/Source/WebCore/contentextensions/ContentExtension.h (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/ContentExtension.h	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/ContentExtension.h	2015-04-03 21:44:41 UTC (rev 182335)
@@ -48,6 +48,7 @@
     const CompiledContentExtension& compiledExtension() const { return m_compiledExtension.get(); }
     StyleSheetContents* globalDisplayNoneStyleSheet();
 
+    mutable Vector<bool> m_pagesUsed;
 private:
     ContentExtension(const String& identifier, Ref<CompiledContentExtension>&&);
 

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp	2015-04-03 21:44:41 UTC (rev 182335)
@@ -79,8 +79,9 @@
     Vector<Action> finalActions;
     ResourceFlags flags = resourceLoadInfo.getResourceFlags();
     for (auto& contentExtension : m_contentExtensions.values()) {
+        RELEASE_ASSERT(contentExtension);
         const CompiledContentExtension& compiledExtension = contentExtension->compiledExtension();
-        DFABytecodeInterpreter interpreter(compiledExtension.bytecode(), compiledExtension.bytecodeLength());
+        DFABytecodeInterpreter interpreter(compiledExtension.bytecode(), compiledExtension.bytecodeLength(), contentExtension->m_pagesUsed);
         DFABytecodeInterpreter::Actions triggeredActions = interpreter.interpret(urlCString, flags);
         
         const SerializedActionByte* actions = compiledExtension.actions();

Modified: trunk/Source/WebCore/contentextensions/ContentExtensionsDebugging.h (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/ContentExtensionsDebugging.h	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/ContentExtensionsDebugging.h	2015-04-03 21:44:41 UTC (rev 182335)
@@ -32,6 +32,9 @@
 
 #define CONTENT_EXTENSIONS_PERFORMANCE_REPORTING 0
 
+#define CONTENT_EXTENSIONS_MEMORY_REPORTING 0
+#define CONTENT_EXTENSIONS_PAGE_SIZE 16384
+
 #endif // ENABLE(CONTENT_EXTENSIONS)
 
 #endif // ContentExtensionsDebugging_h

Modified: trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp	2015-04-03 21:44:41 UTC (rev 182335)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "DFABytecodeInterpreter.h"
 
+#include "ContentExtensionsDebugging.h"
 #include <wtf/text/CString.h>
 
 #if ENABLE(CONTENT_EXTENSIONS)
@@ -35,24 +36,32 @@
 namespace ContentExtensions {
 
 template <typename IntType>
-static inline IntType getBits(const DFABytecode* bytecode, unsigned bytecodeLength, unsigned index)
+static inline IntType getBits(const DFABytecode* bytecode, unsigned bytecodeLength, unsigned index, Vector<bool>& pagesUsed)
 {
+#if CONTENT_EXTENSIONS_MEMORY_REPORTING
+    unsigned page = index / CONTENT_EXTENSIONS_PAGE_SIZE;
+    while (pagesUsed.size() < (bytecodeLength + CONTENT_EXTENSIONS_PAGE_SIZE - 1) / CONTENT_EXTENSIONS_PAGE_SIZE)
+        pagesUsed.append(false);
+    pagesUsed[page] = true;
+#else
+    UNUSED_PARAM(pagesUsed);
+#endif
     ASSERT_UNUSED(bytecodeLength, index + sizeof(IntType) <= bytecodeLength);
     return *reinterpret_cast<const IntType*>(&bytecode[index]);
 }
     
 void DFABytecodeInterpreter::interpretAppendAction(unsigned& programCounter, Actions& actions)
 {
-    ASSERT(getBits<DFABytecodeInstruction>(m_bytecode, m_bytecodeLength, programCounter) == DFABytecodeInstruction::AppendAction);
-    actions.add(static_cast<uint64_t>(getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode))));
+    ASSERT(getBits<DFABytecodeInstruction>(m_bytecode, m_bytecodeLength, programCounter, m_pagesUsed) == DFABytecodeInstruction::AppendAction);
+    actions.add(static_cast<uint64_t>(getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode), m_pagesUsed)));
     programCounter += instructionSizeWithArguments(DFABytecodeInstruction::AppendAction);
 }
 
 void DFABytecodeInterpreter::interpretTestFlagsAndAppendAction(unsigned& programCounter, uint16_t flags, Actions& actions)
 {
-    ASSERT(getBits<DFABytecodeInstruction>(m_bytecode, m_bytecodeLength, programCounter) == DFABytecodeInstruction::TestFlagsAndAppendAction);
-    if (flags & getBits<uint16_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode)))
-        actions.add(static_cast<uint64_t>(getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint16_t))));
+    ASSERT(getBits<DFABytecodeInstruction>(m_bytecode, m_bytecodeLength, programCounter, m_pagesUsed) == DFABytecodeInstruction::TestFlagsAndAppendAction);
+    if (flags & getBits<uint16_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode), m_pagesUsed))
+        actions.add(static_cast<uint64_t>(getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint16_t), m_pagesUsed)));
     programCounter += instructionSizeWithArguments(DFABytecodeInstruction::TestFlagsAndAppendAction);
 }
 
@@ -61,7 +70,7 @@
     Actions actions;
 
     // DFA header.
-    unsigned dfaBytecodeLength = getBits<unsigned>(m_bytecode, m_bytecodeLength, 0);
+    unsigned dfaBytecodeLength = getBits<unsigned>(m_bytecode, m_bytecodeLength, 0, m_pagesUsed);
     unsigned programCounter = sizeof(unsigned);
 
     while (programCounter < dfaBytecodeLength) {
@@ -88,7 +97,7 @@
 
         // DFA header.
         unsigned dfaStart = programCounter;
-        unsigned dfaBytecodeLength = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter);
+        unsigned dfaBytecodeLength = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter, m_pagesUsed);
         programCounter += sizeof(unsigned);
 
         // Skip the actions on the DFA root. These are accessed via actionsFromDFARoot.
@@ -127,8 +136,8 @@
 
                 // Check to see if the next character in the url is the value stored with the bytecode.
                 char character = url[urlIndex];
-                if (character == getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode))) {
-                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t));
+                if (character == getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode), m_pagesUsed)) {
+                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t), m_pagesUsed);
                     if (!character)
                         urlIndexIsAfterEndOfString = true;
                     urlIndex++; // This represents an edge in the DFA.
@@ -143,8 +152,8 @@
 
                 // Check to see if the next character in the url is the value stored with the bytecode.
                 char character = toASCIILower(url[urlIndex]);
-                if (character == getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode))) {
-                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t));
+                if (character == getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode), m_pagesUsed)) {
+                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t), m_pagesUsed);
                     if (!character)
                         urlIndexIsAfterEndOfString = true;
                     urlIndex++; // This represents an edge in the DFA.
@@ -158,9 +167,9 @@
                     goto nextDFA;
                 
                 char character = url[urlIndex];
-                if (character >= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode))
-                    && character <= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t))) {
-                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t) + sizeof(uint8_t));
+                if (character >= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode), m_pagesUsed)
+                    && character <= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t), m_pagesUsed)) {
+                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t) + sizeof(uint8_t), m_pagesUsed);
                     if (!character)
                         urlIndexIsAfterEndOfString = true;
                     urlIndex++; // This represents an edge in the DFA.
@@ -174,9 +183,9 @@
                     goto nextDFA;
                 
                 char character = toASCIILower(url[urlIndex]);
-                if (character >= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode))
-                    && character <= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t))) {
-                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t) + sizeof(uint8_t));
+                if (character >= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode), m_pagesUsed)
+                    && character <= getBits<uint8_t>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t), m_pagesUsed)) {
+                    programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode) + sizeof(uint8_t) + sizeof(uint8_t), m_pagesUsed);
                     if (!character)
                         urlIndexIsAfterEndOfString = true;
                     urlIndex++; // This represents an edge in the DFA.
@@ -189,7 +198,7 @@
                 if (!url[urlIndex] || urlIndexIsAfterEndOfString)
                     goto nextDFA;
                 
-                programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode));
+                programCounter = getBits<unsigned>(m_bytecode, m_bytecodeLength, programCounter + sizeof(DFABytecode), m_pagesUsed);
                 urlIndex++; // This represents an edge in the DFA.
                 break;
                     

Modified: trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h (182334 => 182335)


--- trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h	2015-04-03 21:32:59 UTC (rev 182334)
+++ trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h	2015-04-03 21:44:41 UTC (rev 182335)
@@ -29,7 +29,9 @@
 #if ENABLE(CONTENT_EXTENSIONS)
 
 #include "ContentExtensionRule.h"
+#include "ContentExtensionsDebugging.h"
 #include "DFABytecode.h"
+#include <wtf/DataLog.h>
 #include <wtf/HashSet.h>
 #include <wtf/Vector.h>
 
@@ -39,11 +41,21 @@
 
 class DFABytecodeInterpreter {
 public:
-    DFABytecodeInterpreter(const DFABytecode* bytecode, unsigned bytecodeLength)
+    DFABytecodeInterpreter(const DFABytecode* bytecode, unsigned bytecodeLength, Vector<bool>& pagesUsed)
         : m_bytecode(bytecode)
         , m_bytecodeLength(bytecodeLength)
+        , m_pagesUsed(pagesUsed)
     {
     }
+    ~DFABytecodeInterpreter()
+    {
+#if CONTENT_EXTENSIONS_MEMORY_REPORTING
+        size_t total = 0;
+        for (bool& b : m_pagesUsed)
+            total += b;
+        dataLogF("Pages used: %zu / %zu\n", total, m_pagesUsed.size());
+#endif
+    }
     
     typedef HashSet<uint64_t, DefaultHash<uint64_t>::Hash, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>> Actions;
     
@@ -55,6 +67,7 @@
     void interpretTestFlagsAndAppendAction(unsigned& programCounter, uint16_t flags, Actions&);
     const DFABytecode* m_bytecode;
     const unsigned m_bytecodeLength;
+    Vector<bool>& m_pagesUsed;
 };
 
 } // namespace ContentExtensions
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to