summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/platform/SharedBuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/platform/SharedBuffer.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/platform/SharedBuffer.cpp140
1 files changed, 52 insertions, 88 deletions
diff --git a/chromium/third_party/WebKit/Source/platform/SharedBuffer.cpp b/chromium/third_party/WebKit/Source/platform/SharedBuffer.cpp
index ead7da21517..d77367ad144 100644
--- a/chromium/third_party/WebKit/Source/platform/SharedBuffer.cpp
+++ b/chromium/third_party/WebKit/Source/platform/SharedBuffer.cpp
@@ -27,8 +27,6 @@
#include "config.h"
#include "platform/SharedBuffer.h"
-#include "platform/PurgeableBuffer.h"
-#include "wtf/PassOwnPtr.h"
#include "wtf/unicode/Unicode.h"
#include "wtf/unicode/UTF8.h"
@@ -143,6 +141,7 @@ static void willDestroySharedBuffer(SharedBuffer* buffer)
SharedBuffer::SharedBuffer()
: m_size(0)
+ , m_buffer(PurgeableVector::NotPurgeable)
{
#ifdef SHARED_BUFFER_STATS
didCreateSharedBuffer(this);
@@ -151,8 +150,10 @@ SharedBuffer::SharedBuffer()
SharedBuffer::SharedBuffer(size_t size)
: m_size(size)
- , m_buffer(size)
+ , m_buffer(PurgeableVector::NotPurgeable)
{
+ m_buffer.reserveCapacity(size);
+ m_buffer.grow(size);
#ifdef SHARED_BUFFER_STATS
didCreateSharedBuffer(this);
#endif
@@ -160,6 +161,22 @@ SharedBuffer::SharedBuffer(size_t size)
SharedBuffer::SharedBuffer(const char* data, int size)
: m_size(0)
+ , m_buffer(PurgeableVector::NotPurgeable)
+{
+ // FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code.
+ if (size < 0)
+ CRASH();
+
+ append(data, size);
+
+#ifdef SHARED_BUFFER_STATS
+ didCreateSharedBuffer(this);
+#endif
+}
+
+SharedBuffer::SharedBuffer(const char* data, int size, PurgeableVector::PurgeableOption purgeable)
+ : m_size(0)
+ , m_buffer(purgeable)
{
// FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code.
if (size < 0)
@@ -174,6 +191,7 @@ SharedBuffer::SharedBuffer(const char* data, int size)
SharedBuffer::SharedBuffer(const unsigned char* data, int size)
: m_size(0)
+ , m_buffer(PurgeableVector::NotPurgeable)
{
// FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code.
if (size < 0)
@@ -198,71 +216,20 @@ SharedBuffer::~SharedBuffer()
PassRefPtr<SharedBuffer> SharedBuffer::adoptVector(Vector<char>& vector)
{
RefPtr<SharedBuffer> buffer = create();
- buffer->m_buffer.swap(vector);
+ buffer->m_buffer.adopt(vector);
buffer->m_size = buffer->m_buffer.size();
return buffer.release();
}
-PassRefPtr<SharedBuffer> SharedBuffer::adoptPurgeableBuffer(PassOwnPtr<PurgeableBuffer> purgeableBuffer)
-{
- ASSERT(!purgeableBuffer->isPurgeable());
- RefPtr<SharedBuffer> buffer = create();
- buffer->m_purgeableBuffer = purgeableBuffer;
- return buffer.release();
-}
-
unsigned SharedBuffer::size() const
{
- if (m_purgeableBuffer)
- return m_purgeableBuffer->size();
-
return m_size;
}
-void SharedBuffer::createPurgeableBuffer() const
-{
- if (m_purgeableBuffer)
- return;
-
- m_purgeableBuffer = PurgeableBuffer::create(buffer().data(), m_size);
-}
-
const char* SharedBuffer::data() const
{
- if (m_purgeableBuffer)
- return m_purgeableBuffer->data();
-
- return this->buffer().data();
-}
-
-void SharedBuffer::moveTo(Vector<char>& result)
-{
- ASSERT(result.isEmpty());
- if (m_purgeableBuffer) {
- result.reserveCapacity(m_purgeableBuffer->size());
- result.append(m_purgeableBuffer->data(), m_purgeableBuffer->size());
- clear();
- return;
- }
-
- unsigned bufferSize = m_buffer.size();
- if (m_size == bufferSize) {
- m_buffer.swap(result);
- clear();
- return;
- }
-
- result.reserveCapacity(m_size);
-
- const char* segment = 0;
- unsigned position = 0;
- while (unsigned segmentSize = getSomeData(segment, position)) {
- result.append(segment, segmentSize);
- position += segmentSize;
- }
- ASSERT(result.size() == m_size);
- clear();
- return;
+ mergeSegmentsIntoBuffer();
+ return m_buffer.data();
}
void SharedBuffer::append(SharedBuffer* data)
@@ -277,17 +244,16 @@ void SharedBuffer::append(SharedBuffer* data)
void SharedBuffer::append(const char* data, unsigned length)
{
- ASSERT(!m_purgeableBuffer);
+ ASSERT(isLocked());
if (!length)
return;
+ ASSERT(m_size >= m_buffer.size());
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);
+ // No need to use segments for small resource data.
m_buffer.append(data, length);
return;
}
@@ -327,19 +293,12 @@ void SharedBuffer::clear()
m_segments.clear();
m_size = 0;
-
m_buffer.clear();
- m_purgeableBuffer.clear();
}
PassRefPtr<SharedBuffer> SharedBuffer::copy() const
{
RefPtr<SharedBuffer> clone(adoptRef(new SharedBuffer));
- if (m_purgeableBuffer) {
- clone->append(data(), size());
- return clone.release();
- }
-
clone->m_size = m_size;
clone->m_buffer.reserveCapacity(m_size);
clone->m_buffer.append(m_buffer.data(), m_buffer.size());
@@ -355,45 +314,31 @@ PassRefPtr<SharedBuffer> SharedBuffer::copy() const
return clone.release();
}
-PassOwnPtr<PurgeableBuffer> SharedBuffer::releasePurgeableBuffer()
-{
- ASSERT(hasOneRef());
- return m_purgeableBuffer.release();
-}
-
-const Vector<char>& SharedBuffer::buffer() const
+void SharedBuffer::mergeSegmentsIntoBuffer() const
{
unsigned bufferSize = m_buffer.size();
if (m_size > bufferSize) {
- m_buffer.resize(m_size);
- char* destination = m_buffer.data() + bufferSize;
+ m_buffer.reserveCapacity(m_size);
unsigned bytesLeft = m_size - bufferSize;
for (unsigned i = 0; i < m_segments.size(); ++i) {
unsigned bytesToCopy = min(bytesLeft, segmentSize);
- memcpy(destination, m_segments[i], bytesToCopy);
- destination += bytesToCopy;
+ m_buffer.append(m_segments[i], bytesToCopy);
bytesLeft -= bytesToCopy;
freeSegment(m_segments[i]);
}
m_segments.clear();
}
- return m_buffer;
}
unsigned SharedBuffer::getSomeData(const char*& someData, unsigned position) const
{
+ ASSERT(isLocked());
unsigned totalSize = size();
if (position >= totalSize) {
someData = 0;
return 0;
}
- if (m_purgeableBuffer) {
- ASSERT_WITH_SECURITY_IMPLICATION(position < size());
- someData = data() + position;
- return totalSize - position;
- }
-
ASSERT_WITH_SECURITY_IMPLICATION(position < m_size);
unsigned consecutiveSize = m_buffer.size();
if (position < consecutiveSize) {
@@ -421,6 +366,9 @@ PassRefPtr<ArrayBuffer> SharedBuffer::getAsArrayBuffer() const
{
RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::createUninitialized(static_cast<unsigned>(size()), 1);
+ if (!arrayBuffer)
+ return nullptr;
+
const char* segment = 0;
unsigned position = 0;
while (unsigned segmentSize = getSomeData(segment, position)) {
@@ -431,7 +379,7 @@ PassRefPtr<ArrayBuffer> SharedBuffer::getAsArrayBuffer() const
if (position != arrayBuffer->byteLength()) {
ASSERT_NOT_REACHED();
// Don't return the incomplete ArrayBuffer.
- return 0;
+ return nullptr;
}
return arrayBuffer;
@@ -451,9 +399,25 @@ PassRefPtr<SkData> SharedBuffer::getAsSkData() const
if (position != bufferLength) {
ASSERT_NOT_REACHED();
// Don't return the incomplete SkData.
- return 0;
+ return nullptr;
}
return adoptRef(SkData::NewFromMalloc(buffer, bufferLength));
}
+bool SharedBuffer::lock()
+{
+ return m_buffer.lock();
+}
+
+void SharedBuffer::unlock()
+{
+ mergeSegmentsIntoBuffer();
+ m_buffer.unlock();
+}
+
+bool SharedBuffer::isLocked() const
+{
+ return m_buffer.isLocked();
+}
+
} // namespace WebCore