Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| index d9d92bc33daabb6ea1bc86a20eb8bcd5a5367da3..30ebd48935b15bb80db3a25cd28ed3429b728104 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| @@ -446,28 +446,36 @@ SerializedScriptValue::transferArrayBufferContents( |
| return contents; |
| } |
| -void SerializedScriptValue::unregisterMemoryAllocatedByCurrentScriptContext() { |
| - // If the caller is the only one holding a reference then this serialized |
| - // value hasn't transferred ownership & no unregistration of allocation |
| - // costs wanted. |
| - if (hasOneRef() || m_adjustTransferableExternalAllocationOnContextTransfer) |
| - return; |
| +void SerializedScriptValue::prepareForTransferringContext() { |
| + // Unlikely that this is non-zero, but discount any already registered |
| + // external allocation for this SerializedScriptValue payload. |
| if (m_externallyAllocatedMemory) { |
| v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
| -static_cast<int64_t>(m_externallyAllocatedMemory)); |
| m_externallyAllocatedMemory = 0; |
| } |
| + |
| + DCHECK(!m_adjustTransferableExternalAllocationOnContextTransfer); |
| + // Mark value as needing re-registration of external allocation |
| + // costs in its target context, as handled by |
| + // |registerMemoryAllocatedWithCurrentScriptContext()|. |
| + // |
| // TODO: if other transferables start accounting for their external |
| // allocations with V8, extend this with corresponding cases. |
| - if (m_arrayBufferContentsArray) { |
| + if (m_arrayBufferContentsArray) |
| + m_adjustTransferableExternalAllocationOnContextTransfer = true; |
| +} |
| + |
| +void SerializedScriptValue::finalizeTransferringContext() { |
|
jbroman
2017/03/13 15:01:14
Why do we believe registerMemoryAllocatedWithCurre
sof
2017/03/13 15:10:49
I don't see how to accommodate that, so we will ha
|
| + // The value successfully transferred context along with costs, |
| + // finalize the operation by subtracting the external allocation |
| + // cost of the transferables. |
| + if (m_arrayBufferContentsArray && |
| + !m_adjustTransferableExternalAllocationOnContextTransfer) { |
| for (auto& buffer : *m_arrayBufferContentsArray) { |
| buffer.adjustExternalAllocatedMemoryUponContextTransfer( |
| WTF::ArrayBufferContents::Leave); |
| } |
| - // Mark value as needing re-registration of external allocation |
| - // costs in its target context, as handled by |
| - // |registerMemoryAllocatedWithCurrentScriptContext()|. |
| - m_adjustTransferableExternalAllocationOnContextTransfer = true; |
| } |
| } |
| @@ -481,12 +489,12 @@ void SerializedScriptValue::registerMemoryAllocatedWithCurrentScriptContext() { |
| v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(diff); |
| if (m_adjustTransferableExternalAllocationOnContextTransfer) { |
| DCHECK(m_arrayBufferContentsArray); |
| + m_adjustTransferableExternalAllocationOnContextTransfer = false; |
| for (size_t i = 0; i < m_arrayBufferContentsArray->size(); ++i) { |
| WTF::ArrayBufferContents& buffer = m_arrayBufferContentsArray->at(i); |
| buffer.adjustExternalAllocatedMemoryUponContextTransfer( |
| WTF::ArrayBufferContents::Enter); |
| } |
| - m_adjustTransferableExternalAllocationOnContextTransfer = false; |
| } |
| } |