| Index: Source/core/dom/Text.cpp
|
| diff --git a/Source/core/dom/Text.cpp b/Source/core/dom/Text.cpp
|
| index fda82942a6398076d20a58bf0a01972e33a9b2a7..24836e07a8c1489873676ea63d510cc8abe843f4 100644
|
| --- a/Source/core/dom/Text.cpp
|
| +++ b/Source/core/dom/Text.cpp
|
| @@ -42,13 +42,48 @@
|
|
|
| namespace blink {
|
|
|
| +#if ENABLE(OILPAN)
|
| +namespace {
|
| +// If the external string kept by a Text node exceed this threshold length,
|
| +// Oilpan is informed. External allocation amounts owned by heap objects are
|
| +// taken into account when scheduling urgent Oilpan GCs.
|
| +//
|
| +// FIXME: having only Text nodes with strings above an ad-hoc local threshold
|
| +// influence Oilpan's GC behavior isn't a satisfactory long-term solution.
|
| +// But code that allocates a lot of Text nodes in tight loops, and not much more,
|
| +// we do have to trigger Oilpan GCs to avoid PartitionAlloc OOMs. The accounting
|
| +// does add overhead on the allocation of every Text node however, so for now, only
|
| +// register those above the given threshold. TBC.
|
| +const size_t stringLengthThreshold = 256;
|
| +
|
| +void increaseExternallyAllocatedBytesIfNeeded(size_t length)
|
| +{
|
| + if (length > stringLengthThreshold)
|
| + Heap::increaseExternallyAllocatedBytes(length);
|
| +}
|
| +
|
| +void increaseExternallyAllocatedBytesAliveIfNeeded(size_t length)
|
| +{
|
| + if (length > stringLengthThreshold)
|
| + Heap::increaseExternallyAllocatedBytesAlive(length);
|
| +}
|
| +
|
| +} // namespace
|
| +#endif
|
| +
|
| PassRefPtrWillBeRawPtr<Text> Text::create(Document& document, const String& data)
|
| {
|
| +#if ENABLE(OILPAN)
|
| + increaseExternallyAllocatedBytesIfNeeded(data.length());
|
| +#endif
|
| return adoptRefWillBeNoop(new Text(document, data, CreateText));
|
| }
|
|
|
| PassRefPtrWillBeRawPtr<Text> Text::createEditingText(Document& document, const String& data)
|
| {
|
| +#if ENABLE(OILPAN)
|
| + increaseExternallyAllocatedBytesIfNeeded(data.length());
|
| +#endif
|
| return adoptRefWillBeNoop(new Text(document, data, CreateEditingText));
|
| }
|
|
|
| @@ -408,6 +443,14 @@ PassRefPtrWillBeRawPtr<Text> Text::cloneWithData(const String& data)
|
| return create(document(), data);
|
| }
|
|
|
| +void Text::trace(Visitor* visitor)
|
| +{
|
| +#if ENABLE(OILPAN)
|
| + increaseExternallyAllocatedBytesAliveIfNeeded(m_data.length());
|
| +#endif
|
| + CharacterData::trace(visitor);
|
| +}
|
| +
|
| #ifndef NDEBUG
|
| void Text::formatForDebugger(char *buffer, unsigned length) const
|
| {
|
|
|