// 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 char* SharedBuffer::data() const { if (hasPlatformData()) return platformData(); #if USE(NETWORK_CFDATA_ARRAY_CALLBACK) if (const char* buffer = singleDataArrayBuffer()) return buffer; #endif return this->buffer().data(); }
void SharedBuffer::createPurgeableBuffer() const { if (m_purgeableBuffer) return; if (hasPlatformData()) return; #if USE(NETWORK_CFDATA_ARRAY_CALLBACK) if (singleDataArrayBuffer()) return; #endif m_purgeableBuffer = PurgeableBuffer::create(buffer().data(), m_size); }
const char* SharedBuffer::data() const { #if ENABLE(DISK_IMAGE_CACHE) if (isMemoryMapped()) return static_cast<const char*>(diskImageCache().dataForItem(m_diskImageCacheId)); #endif if (hasPlatformData()) return platformData(); #if USE(NETWORK_CFDATA_ARRAY_CALLBACK) if (const char* buffer = singleDataArrayBuffer()) return buffer; #endif createPurgeableBuffer(); if (m_purgeableBuffer) return m_purgeableBuffer->data(); return this->buffer().data(); }