void SharedBuffer::append(const char* data, unsigned length) { ASSERT(!m_purgeableBuffer); if (!length) return; #if ENABLE(MEMORY_OUT_HANDLING) if (WTF::MemoryOutManager::AbortReached()) return; #endif maybeTransferPlatformData(); unsigned positionInSegment = offsetInSegment(m_size - m_buffer.size()); m_size += length; if (m_size <= segmentSize) { // No need to use segments for small resource data if (m_buffer.isEmpty()) m_buffer.reserveInitialCapacity(length); m_buffer.append(data, length); return; } char* segment; if (!positionInSegment) { segment = allocateSegment(); #if ENABLE(MEMORY_OUT_HANDLING) if (!segment) return; #endif m_segments.append(segment); } else segment = m_segments.last() + positionInSegment; unsigned segmentFreeSpace = segmentSize - positionInSegment; unsigned bytesToCopy = min(length, segmentFreeSpace); for (;;) { memcpy(segment, data, bytesToCopy); if (static_cast<unsigned>(length) == bytesToCopy) break; length -= bytesToCopy; data += bytesToCopy; segment = allocateSegment(); #if ENABLE(MEMORY_OUT_HANDLING) if (!segment) return; #endif m_segments.append(segment); bytesToCopy = min(length, segmentSize); } }
void SharedBuffer::append(const char* data, unsigned length) { ASSERT(!m_purgeableBuffer); #if ENABLE(DISK_IMAGE_CACHE) ASSERT(!isMemoryMapped()); #endif if (!length) return; maybeTransferPlatformData(); #if !USE(NETWORK_CFDATA_ARRAY_CALLBACK) unsigned positionInSegment = offsetInSegment(m_size - m_buffer->data.size()); m_size += length; if (m_size <= segmentSize) { // No need to use segments for small resource data if (m_buffer->data.isEmpty()) m_buffer->data.reserveInitialCapacity(length); appendToDataBuffer(data, length); return; } char* segment; if (!positionInSegment) { segment = allocateSegment(); m_segments.append(segment); } else segment = m_segments.last() + positionInSegment; unsigned segmentFreeSpace = segmentSize - positionInSegment; unsigned bytesToCopy = std::min(length, segmentFreeSpace); for (;;) { memcpy(segment, data, bytesToCopy); if (static_cast<unsigned>(length) == bytesToCopy) break; length -= bytesToCopy; data += bytesToCopy; segment = allocateSegment(); m_segments.append(segment); bytesToCopy = std::min(length, segmentSize); } #else m_size += length; if (m_buffer->data.isEmpty()) m_buffer->data.reserveInitialCapacity(length); appendToDataBuffer(data, length); #endif }
void SharedBuffer::append(const char* data, unsigned length) { ASSERT(!m_purgeableBuffer); if (!length) return; maybeTransferPlatformData(); unsigned positionInSegment = offsetInSegment(m_size - m_buffer.size()); m_size += length; if (m_size <= segmentSize) { // No need to use segments for small resource data m_buffer.append(data, length); return; } char* segment; if (!positionInSegment) { segment = allocateSegment(); m_segments.append(segment); } else segment = m_segments.last() + positionInSegment; unsigned segmentFreeSpace = segmentSize - positionInSegment; unsigned bytesToCopy = min(length, segmentFreeSpace); for (;;) { memcpy(segment, data, bytesToCopy); if (static_cast<unsigned>(length) == bytesToCopy) break; length -= bytesToCopy; data += bytesToCopy; segment = allocateSegment(); m_segments.append(segment); bytesToCopy = min(length, segmentSize); } }