15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 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 AND ITS CONTRIBUTORS "AS IS" AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef PODArena_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define PODArena_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdint.h> 307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Assertions.h" 317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/FastMalloc.h" 327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Noncopyable.h" 337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/OwnPtr.h" 347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/PassOwnPtr.h" 357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/RefCounted.h" 367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Vector.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// An arena which allocates only Plain Old Data (POD), or classes and 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// structs bottoming out in Plain Old Data. NOTE: the constructors of 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the objects allocated in this arena are called, but _not_ their 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// destructors. 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)class PODArena FINAL : public RefCounted<PODArena> { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The arena is configured with an allocator, which is responsible 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // for allocating and freeing chunks of memory at a time. 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class Allocator : public RefCounted<Allocator> { 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void* allocate(size_t size) = 0; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void free(void* ptr) = 0; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) protected: 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~Allocator() { } 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class WTF::RefCounted<Allocator>; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The Arena's default allocator, which uses fastMalloc and 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fastFree to allocate chunks of storage. 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class FastMallocAllocator : public Allocator { 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<FastMallocAllocator> create() 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new FastMallocAllocator); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual void* allocate(size_t size) OVERRIDE { return fastMalloc(size); } 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual void free(void* ptr) OVERRIDE { fastFree(ptr); } 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) protected: 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FastMallocAllocator() { } 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Creates a new PODArena configured with a FastMallocAllocator. 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<PODArena> create() 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new PODArena); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Creates a new PODArena configured with the given Allocator. 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<PODArena> create(PassRefPtr<Allocator> allocator) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new PODArena(allocator)); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Allocates an object from the arena. 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template<class T> T* allocateObject() 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new (allocateBase<T>()) T(); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Allocates an object from the arena, calling a single-argument constructor. 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template<class T, class Argument1Type> T* allocateObject(const Argument1Type& argument1) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new (allocateBase<T>()) T(argument1); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The initial size of allocated chunks; increases as necessary to 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // satisfy large allocations. Mainly public for unit tests. 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum { 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DefaultChunkSize = 16384 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class WTF::RefCounted<PODArena>; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PODArena() 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_allocator(FastMallocAllocator::create()) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_current(0) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_currentChunkSize(DefaultChunkSize) { } 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit PODArena(PassRefPtr<Allocator> allocator) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_allocator(allocator) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_current(0) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_currentChunkSize(DefaultChunkSize) { } 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns the alignment requirement for classes and structs on the 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // current platform. 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template <class T> static size_t minAlignment() 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return WTF_ALIGN_OF(T); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template<class T> void* allocateBase() 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* ptr = 0; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t roundedSize = roundUp(sizeof(T), minAlignment<T>()); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_current) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ptr = m_current->allocate(roundedSize); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ptr) { 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (roundedSize > m_currentChunkSize) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentChunkSize = roundedSize; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_chunks.append(adoptPtr(new Chunk(m_allocator.get(), m_currentChunkSize))); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_current = m_chunks.last().get(); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ptr = m_current->allocate(roundedSize); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ptr; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Rounds up the given allocation size to the specified alignment. 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t roundUp(size_t size, size_t alignment) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!(alignment % 2)); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (size + alignment - 1) & ~(alignment - 1); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Manages a chunk of memory and individual allocations out of it. 149f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) class Chunk FINAL { 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(Chunk); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Allocates a block of memory of the given size from the passed 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Allocator. 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Chunk(Allocator* allocator, size_t size) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_allocator(allocator) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_size(size) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_currentOffset(0) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_base = static_cast<uint8_t*>(m_allocator->allocate(size)); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Frees the memory allocated from the Allocator in the 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // constructor. 164f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ~Chunk() 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_allocator->free(m_base); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns a pointer to "size" bytes of storage, or 0 if this 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Chunk could not satisfy the allocation. 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* allocate(size_t size) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check for overflow 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_currentOffset + size < m_currentOffset) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_currentOffset + size > m_size) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* result = m_base + m_currentOffset; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_currentOffset += size; 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) protected: 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Allocator* m_allocator; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint8_t* m_base; 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t m_size; 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t m_currentOffset; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<Allocator> m_allocator; 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Chunk* m_current; 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t m_currentChunkSize; 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<OwnPtr<Chunk> > m_chunks; 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // PODArena_h 201