// Try to create a PurgeableBuffer. We can fail to create one for any of the // following reasons: // - shouldUsePurgeableMemory is set to false. // - the size of the buffer is less than the minimum size required by // PurgeableBuffer (currently 16k). // - PurgeableBuffer::createUninitialized() call fails. void SharedBuffer::createPurgeableBuffer() const { if (m_purgeableBuffer) return; if (hasPlatformData()) return; #if USE(NETWORK_CFDATA_ARRAY_CALLBACK) if (singleDataArrayBuffer()) return; #endif if (!m_buffer->hasOneRef()) return; if (!m_shouldUsePurgeableMemory) return; char* destination = 0; m_purgeableBuffer = PurgeableBuffer::createUninitialized(m_size, destination); if (!m_purgeableBuffer) return; unsigned bufferSize = m_buffer->data.size(); if (bufferSize) { memcpy(destination, m_buffer->data.data(), bufferSize); destination += bufferSize; (const_cast<SharedBuffer*>(this))->clearDataBuffer(); } copyBufferAndClear(destination, m_size - bufferSize); }
const Vector<char>& SharedBuffer::buffer() const { unsigned bufferSize = m_buffer->data.size(); if (m_size > bufferSize) { duplicateDataBufferIfNecessary(); m_buffer->data.resize(m_size); copyBufferAndClear(m_buffer->data.data() + bufferSize, m_size - bufferSize); } return m_buffer->data; }
const Vector<char>& SharedBuffer::buffer() const { #if ENABLE(DISK_IMAGE_CACHE) ASSERT(!isMemoryMapped()); #endif unsigned bufferSize = m_buffer.size(); if (m_size > bufferSize) { m_buffer.resize(m_size); copyBufferAndClear(m_buffer.data() + bufferSize, m_size - bufferSize); } return m_buffer; }
const Vector<char>& SharedBuffer::buffer() const { #if ENABLE(DISK_IMAGE_CACHE) ASSERT(!isMemoryMapped()); #endif unsigned bufferSize = m_buffer->data.size(); if (m_size > bufferSize) { duplicateDataBufferIfNecessary(); m_buffer->data.resize(m_size); copyBufferAndClear(m_buffer->data.data() + bufferSize, m_size - bufferSize); } return m_buffer->data; }