OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 return new (allocateBase<T>()) T(argument1); | 95 return new (allocateBase<T>()) T(argument1); |
96 } | 96 } |
97 | 97 |
98 // The initial size of allocated chunks; increases as necessary to | 98 // The initial size of allocated chunks; increases as necessary to |
99 // satisfy large allocations. Mainly public for unit tests. | 99 // satisfy large allocations. Mainly public for unit tests. |
100 enum { | 100 enum { |
101 DefaultChunkSize = 16384 | 101 DefaultChunkSize = 16384 |
102 }; | 102 }; |
103 | 103 |
104 protected: | 104 protected: |
105 virtual ~PODArena() { } | |
106 friend class WTF::RefCounted<PODArena>; | 105 friend class WTF::RefCounted<PODArena>; |
107 | 106 |
108 PODArena() | 107 PODArena() |
109 : m_allocator(FastMallocAllocator::create()) | 108 : m_allocator(FastMallocAllocator::create()) |
110 , m_current(0) | 109 , m_current(0) |
111 , m_currentChunkSize(DefaultChunkSize) { } | 110 , m_currentChunkSize(DefaultChunkSize) { } |
112 | 111 |
113 explicit PODArena(PassRefPtr<Allocator> allocator) | 112 explicit PODArena(PassRefPtr<Allocator> allocator) |
114 : m_allocator(allocator) | 113 : m_allocator(allocator) |
115 , m_current(0) | 114 , m_current(0) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 Chunk(Allocator* allocator, size_t size) | 154 Chunk(Allocator* allocator, size_t size) |
156 : m_allocator(allocator) | 155 : m_allocator(allocator) |
157 , m_size(size) | 156 , m_size(size) |
158 , m_currentOffset(0) | 157 , m_currentOffset(0) |
159 { | 158 { |
160 m_base = static_cast<uint8_t*>(m_allocator->allocate(size)); | 159 m_base = static_cast<uint8_t*>(m_allocator->allocate(size)); |
161 } | 160 } |
162 | 161 |
163 // Frees the memory allocated from the Allocator in the | 162 // Frees the memory allocated from the Allocator in the |
164 // constructor. | 163 // constructor. |
165 virtual ~Chunk() | 164 ~Chunk() |
166 { | 165 { |
167 m_allocator->free(m_base); | 166 m_allocator->free(m_base); |
168 } | 167 } |
169 | 168 |
170 // Returns a pointer to "size" bytes of storage, or 0 if this | 169 // Returns a pointer to "size" bytes of storage, or 0 if this |
171 // Chunk could not satisfy the allocation. | 170 // Chunk could not satisfy the allocation. |
172 void* allocate(size_t size) | 171 void* allocate(size_t size) |
173 { | 172 { |
174 // Check for overflow | 173 // Check for overflow |
175 if (m_currentOffset + size < m_currentOffset) | 174 if (m_currentOffset + size < m_currentOffset) |
(...skipping 16 matching lines...) Expand all Loading... |
192 | 191 |
193 RefPtr<Allocator> m_allocator; | 192 RefPtr<Allocator> m_allocator; |
194 Chunk* m_current; | 193 Chunk* m_current; |
195 size_t m_currentChunkSize; | 194 size_t m_currentChunkSize; |
196 Vector<OwnPtr<Chunk> > m_chunks; | 195 Vector<OwnPtr<Chunk> > m_chunks; |
197 }; | 196 }; |
198 | 197 |
199 } // namespace WebCore | 198 } // namespace WebCore |
200 | 199 |
201 #endif // PODArena_h | 200 #endif // PODArena_h |
OLD | NEW |