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
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/contentextensions/CompiledContentExtension.cpp
- trunk/Source/WebCore/contentextensions/CompiledContentExtension.h
- trunk/Source/WebCore/contentextensions/ContentExtension.cpp
- trunk/Source/WebCore/contentextensions/ContentExtension.h
- trunk/Source/WebCore/contentextensions/ContentExtensionsBackend.cpp
- trunk/Source/WebCore/contentextensions/ContentExtensionsDebugging.h
- trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp
- trunk/Source/WebCore/contentextensions/DFABytecodeInterpreter.h
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