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