15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/SharedBuffer.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/unicode/Unicode.h" 317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/unicode/UTF8.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#undef SHARED_BUFFER_STATS 34521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 35521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 36521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/DataLog.h" 37521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/MainThread.h" 38521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#endif 39521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned segmentSize = 0x1000; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned segmentPositionMask = 0x0FFF; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline unsigned segmentIndex(unsigned position) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return position / segmentSize; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline unsigned offsetInSegment(unsigned position) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return position & segmentPositionMask; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline char* allocateSegment() 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<char*>(fastMalloc(segmentSize)); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline void freeSegment(char* p) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fastFree(p); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 65521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 66521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 67521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)static Mutex& statsMutex() 68521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 69521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) DEFINE_STATIC_LOCAL(Mutex, mutex, ()); 70521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return mutex; 71521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 72521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 73521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)static HashSet<SharedBuffer*>& liveBuffers() 74521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 75521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) DEFINE_STATIC_LOCAL(HashSet<SharedBuffer*>, buffers, ()); 76521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return buffers; 77521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 78521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 79521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)static bool sizeComparator(SharedBuffer* a, SharedBuffer* b) 80521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 81521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return a->size() > b->size(); 82521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 83521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 84521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)static CString snippetForBuffer(SharedBuffer* sharedBuffer) 85521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 86521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) const unsigned kMaxSnippetLength = 64; 87521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) char* snippet = 0; 88521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) unsigned snippetLength = std::min(sharedBuffer->size(), kMaxSnippetLength); 89521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CString result = CString::newUninitialized(snippetLength, snippet); 90521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 91521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) const char* segment; 92521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) unsigned offset = 0; 93521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (unsigned segmentLength = sharedBuffer->getSomeData(segment, offset)) { 94521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) unsigned length = std::min(segmentLength, snippetLength - offset); 95521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) memcpy(snippet + offset, segment, length); 96521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) offset += segmentLength; 97521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (offset >= snippetLength) 98521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 99521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 100521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 101521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) for (unsigned i = 0; i < snippetLength; ++i) { 102521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!isASCIIPrintable(snippet[i])) 103521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) snippet[i] = '?'; 104521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 105521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 106521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return result; 107521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 108521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 109521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)static void printStats(void*) 110521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 111521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) MutexLocker locker(statsMutex()); 112521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Vector<SharedBuffer*> buffers; 113521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) for (HashSet<SharedBuffer*>::const_iterator iter = liveBuffers().begin(); iter != liveBuffers().end(); ++iter) 114521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) buffers.append(*iter); 115521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) std::sort(buffers.begin(), buffers.end(), sizeComparator); 116521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 117521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) dataLogF("---- Shared Buffer Stats ----\n"); 118521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) for (size_t i = 0; i < buffers.size() && i < 64; ++i) { 119521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CString snippet = snippetForBuffer(buffers[i]); 120521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) dataLogF("Buffer size=%8u %s\n", buffers[i]->size(), snippet.data()); 121521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 122521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 123521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 124521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)static void didCreateSharedBuffer(SharedBuffer* buffer) 125521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 126521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) MutexLocker locker(statsMutex()); 127521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) liveBuffers().add(buffer); 128521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 129521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) callOnMainThread(printStats, 0); 130521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 131521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 132521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)static void willDestroySharedBuffer(SharedBuffer* buffer) 133521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 134521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) MutexLocker locker(statsMutex()); 135521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) liveBuffers().remove(buffer); 136521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 137521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 138521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#endif 139521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SharedBuffer::SharedBuffer() 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_size(0) 142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_buffer(PurgeableVector::NotPurgeable) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 144521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 145521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) didCreateSharedBuffer(this); 146521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#endif 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SharedBuffer::SharedBuffer(size_t size) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_size(size) 151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_buffer(PurgeableVector::NotPurgeable) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_buffer.reserveCapacity(size); 154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_buffer.grow(size); 155521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 156521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) didCreateSharedBuffer(this); 157521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#endif 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SharedBuffer::SharedBuffer(const char* data, int size) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_size(0) 162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_buffer(PurgeableVector::NotPurgeable) 163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code. 165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (size < 0) 166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) CRASH(); 167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) append(data, size); 169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) didCreateSharedBuffer(this); 172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#endif 173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 174d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)SharedBuffer::SharedBuffer(const char* data, int size, PurgeableVector::PurgeableOption purgeable) 176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) : m_size(0) 177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_buffer(purgeable) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code. 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (size < 0) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CRASH(); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) append(data, size); 184521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 185521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 186521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) didCreateSharedBuffer(this); 187521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#endif 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SharedBuffer::SharedBuffer(const unsigned char* data, int size) 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_size(0) 192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_buffer(PurgeableVector::NotPurgeable) 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Use unsigned consistently, and check for invalid casts when calling into SharedBuffer from other code. 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (size < 0) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CRASH(); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) append(reinterpret_cast<const char*>(data), size); 199521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 200521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 201521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) didCreateSharedBuffer(this); 202521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#endif 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 20402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SharedBuffer::~SharedBuffer() 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clear(); 208521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 209521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#ifdef SHARED_BUFFER_STATS 210521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) willDestroySharedBuffer(this); 211521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#endif 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SharedBuffer> SharedBuffer::adoptVector(Vector<char>& vector) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<SharedBuffer> buffer = create(); 217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) buffer->m_buffer.adopt(vector); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) buffer->m_size = buffer->m_buffer.size(); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return buffer.release(); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned SharedBuffer::size() const 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_size; 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char* SharedBuffer::data() const 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 229d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) mergeSegmentsIntoBuffer(); 230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return m_buffer.data(); 2313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch} 2323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 233197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid SharedBuffer::append(PassRefPtr<SharedBuffer> data) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char* segment; 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t position = 0; 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (size_t length = data->getSomeData(segment, position)) { 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) append(segment, length); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) position += length; 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SharedBuffer::append(const char* data, unsigned length) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(isLocked()); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!length) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(m_size >= m_buffer.size()); 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned positionInSegment = offsetInSegment(m_size - m_buffer.size()); 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size += length; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_size <= segmentSize) { 254d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // No need to use segments for small resource data. 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_buffer.append(data, length); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char* segment; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!positionInSegment) { 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segment = allocateSegment(); 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_segments.append(segment); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segment = m_segments.last() + positionInSegment; 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned segmentFreeSpace = segmentSize - positionInSegment; 2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci unsigned bytesToCopy = std::min(length, segmentFreeSpace); 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (;;) { 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) memcpy(segment, data, bytesToCopy); 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (static_cast<unsigned>(length) == bytesToCopy) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) length -= bytesToCopy; 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) data += bytesToCopy; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) segment = allocateSegment(); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_segments.append(segment); 2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bytesToCopy = std::min(length, segmentSize); 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SharedBuffer::append(const Vector<char>& data) 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) append(data.data(), data.size()); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SharedBuffer::clear() 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < m_segments.size(); ++i) 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeSegment(m_segments[i]); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_segments.clear(); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size = 0; 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_buffer.clear(); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SharedBuffer> SharedBuffer::copy() const 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<SharedBuffer> clone(adoptRef(new SharedBuffer)); 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clone->m_size = m_size; 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clone->m_buffer.reserveCapacity(m_size); 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clone->m_buffer.append(m_buffer.data(), m_buffer.size()); 303e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (!m_segments.isEmpty()) { 304e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch const char* segment = 0; 305e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch unsigned position = m_buffer.size(); 306e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch while (unsigned segmentSize = getSomeData(segment, position)) { 307e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch clone->m_buffer.append(segment, segmentSize); 308e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch position += segmentSize; 309e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 310e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ASSERT(position == clone->size()); 311e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 312e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return clone.release(); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void SharedBuffer::mergeSegmentsIntoBuffer() const 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned bufferSize = m_buffer.size(); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_size > bufferSize) { 319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_buffer.reserveCapacity(m_size); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned bytesLeft = m_size - bufferSize; 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < m_segments.size(); ++i) { 3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci unsigned bytesToCopy = std::min(bytesLeft, segmentSize); 323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_buffer.append(m_segments[i], bytesToCopy); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bytesLeft -= bytesToCopy; 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) freeSegment(m_segments[i]); 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_segments.clear(); 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned SharedBuffer::getSomeData(const char*& someData, unsigned position) const 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 333d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(isLocked()); 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned totalSize = size(); 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (position >= totalSize) { 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) someData = 0; 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(position < m_size); 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned consecutiveSize = m_buffer.size(); 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (position < consecutiveSize) { 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) someData = m_buffer.data() + position; 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return consecutiveSize - position; 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 34602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) position -= consecutiveSize; 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned segments = m_segments.size(); 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned maxSegmentedSize = segments * segmentSize; 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned segment = segmentIndex(position); 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (segment < segments) { 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned bytesLeft = totalSize - consecutiveSize; 3537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci unsigned segmentedSize = std::min(maxSegmentedSize, bytesLeft); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned positionInSegment = offsetInSegment(position); 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) someData = m_segments[segment] + positionInSegment; 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return segment == segments - 1 ? segmentedSize - position : segmentSize - positionInSegment; 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)PassRefPtr<ArrayBuffer> SharedBuffer::getAsArrayBuffer() const 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::createUninitialized(static_cast<unsigned>(size()), 1); 3665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 36710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!arrayBuffer) 36810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return nullptr; 36910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 3705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) const char* segment = 0; 3715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) unsigned position = 0; 3725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) while (unsigned segmentSize = getSomeData(segment, position)) { 3735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) memcpy(static_cast<char*>(arrayBuffer->data()) + position, segment, segmentSize); 3745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) position += segmentSize; 3755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 3765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (position != arrayBuffer->byteLength()) { 3785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) ASSERT_NOT_REACHED(); 3795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // Don't return the incomplete ArrayBuffer. 380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 3815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return arrayBuffer; 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)PassRefPtr<SkData> SharedBuffer::getAsSkData() const 38751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 38851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) unsigned bufferLength = size(); 3897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SkData* data = SkData::NewUninitialized(bufferLength); 3907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci char* buffer = static_cast<char*>(data->writable_data()); 39151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) const char* segment = 0; 39251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) unsigned position = 0; 39351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) while (unsigned segmentSize = getSomeData(segment, position)) { 39451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) memcpy(buffer + position, segment, segmentSize); 39551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) position += segmentSize; 39651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 39751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 39851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (position != bufferLength) { 39951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT_NOT_REACHED(); 40051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // Don't return the incomplete SkData. 401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 40251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 4037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return adoptRef(data); 40451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 40551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool SharedBuffer::lock() 407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return m_buffer.lock(); 409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void SharedBuffer::unlock() 412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 413d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) mergeSegmentsIntoBuffer(); 414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_buffer.unlock(); 415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool SharedBuffer::isLocked() const 418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return m_buffer.isLocked(); 420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 422c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 423