164 static void initialize() { |
164 static void initialize() { |
165 _large_pool = new ChunkPool(Chunk::size + Chunk::aligned_overhead_size()); |
165 _large_pool = new ChunkPool(Chunk::size + Chunk::aligned_overhead_size()); |
166 _medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size()); |
166 _medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size()); |
167 _small_pool = new ChunkPool(Chunk::init_size + Chunk::aligned_overhead_size()); |
167 _small_pool = new ChunkPool(Chunk::init_size + Chunk::aligned_overhead_size()); |
168 } |
168 } |
|
169 |
|
170 static void clean() { |
|
171 enum { BlocksToKeep = 5 }; |
|
172 _small_pool->free_all_but(BlocksToKeep); |
|
173 _medium_pool->free_all_but(BlocksToKeep); |
|
174 _large_pool->free_all_but(BlocksToKeep); |
|
175 } |
169 }; |
176 }; |
170 |
177 |
171 ChunkPool* ChunkPool::_large_pool = NULL; |
178 ChunkPool* ChunkPool::_large_pool = NULL; |
172 ChunkPool* ChunkPool::_medium_pool = NULL; |
179 ChunkPool* ChunkPool::_medium_pool = NULL; |
173 ChunkPool* ChunkPool::_small_pool = NULL; |
180 ChunkPool* ChunkPool::_small_pool = NULL; |
174 |
181 |
175 |
|
176 void chunkpool_init() { |
182 void chunkpool_init() { |
177 ChunkPool::initialize(); |
183 ChunkPool::initialize(); |
178 } |
184 } |
179 |
185 |
|
186 void |
|
187 Chunk::clean_chunk_pool() { |
|
188 ChunkPool::clean(); |
|
189 } |
|
190 |
180 |
191 |
181 //-------------------------------------------------------------------------------------- |
192 //-------------------------------------------------------------------------------------- |
182 // ChunkPoolCleaner implementation |
193 // ChunkPoolCleaner implementation |
|
194 // |
183 |
195 |
184 class ChunkPoolCleaner : public PeriodicTask { |
196 class ChunkPoolCleaner : public PeriodicTask { |
185 enum { CleaningInterval = 5000, // cleaning interval in ms |
197 enum { CleaningInterval = 5000 }; // cleaning interval in ms |
186 BlocksToKeep = 5 // # of extra blocks to keep |
|
187 }; |
|
188 |
198 |
189 public: |
199 public: |
190 ChunkPoolCleaner() : PeriodicTask(CleaningInterval) {} |
200 ChunkPoolCleaner() : PeriodicTask(CleaningInterval) {} |
191 void task() { |
201 void task() { |
192 ChunkPool::small_pool()->free_all_but(BlocksToKeep); |
202 ChunkPool::clean(); |
193 ChunkPool::medium_pool()->free_all_but(BlocksToKeep); |
|
194 ChunkPool::large_pool()->free_all_but(BlocksToKeep); |
|
195 } |
203 } |
196 }; |
204 }; |
197 |
205 |
198 //-------------------------------------------------------------------------------------- |
206 //-------------------------------------------------------------------------------------- |
199 // Chunk implementation |
207 // Chunk implementation |