testGCChunkPool.cpp (1826B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 3 */ 4 /* This Source Code Form is subject to the terms of the Mozilla Public 5 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 8 #include "gc/GCLock.h" 9 #include "gc/GCRuntime.h" 10 #include "jsapi-tests/tests.h" 11 12 BEGIN_TEST(testGCChunkPool) { 13 using namespace js::gc; 14 15 const int N = 10; 16 ChunkPool pool; 17 18 // Create. 19 for (int i = 0; i < N; ++i) { 20 void* ptr = ArenaChunk::allocate(&cx->runtime()->gc, StallAndRetry::No); 21 CHECK(ptr); 22 ArenaChunk* chunk = ArenaChunk::init(ptr, &cx->runtime()->gc, true); 23 CHECK(chunk); 24 pool.push(chunk); 25 } 26 MOZ_ASSERT(pool.verify()); 27 28 // Iterate. 29 uint32_t i = 0; 30 for (ChunkPool::Iter iter(pool); !iter.done(); iter.next(), ++i) { 31 CHECK(iter.get()); 32 } 33 CHECK(i == pool.count()); 34 MOZ_ASSERT(pool.verify()); 35 36 // Push/Pop. 37 for (int i = 0; i < N; ++i) { 38 ArenaChunk* chunkA = pool.pop(); 39 ArenaChunk* chunkB = pool.pop(); 40 ArenaChunk* chunkC = pool.pop(); 41 pool.push(chunkA); 42 pool.push(chunkB); 43 pool.push(chunkC); 44 } 45 MOZ_ASSERT(pool.verify()); 46 47 // Remove. 48 ArenaChunk* chunk = nullptr; 49 int offset = N / 2; 50 for (ChunkPool::Iter iter(pool); !iter.done(); iter.next(), --offset) { 51 if (offset == 0) { 52 chunk = pool.remove(iter.get()); 53 break; 54 } 55 } 56 CHECK(chunk); 57 MOZ_ASSERT(!pool.contains(chunk)); 58 MOZ_ASSERT(pool.verify()); 59 pool.push(chunk); 60 61 // Destruct. 62 js::AutoLockGC lock(cx->runtime()); 63 for (ChunkPool::Iter iter(pool); !iter.done();) { 64 ArenaChunk* chunk = iter.get(); 65 iter.next(); 66 pool.remove(chunk); 67 UnmapPages(chunk, ChunkSize); 68 } 69 70 return true; 71 } 72 END_TEST(testGCChunkPool)