mirror of
https://github.com/classilla/tenfourfox.git
synced 2024-06-01 17:41:34 +00:00
72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
|
*/
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "mozilla/Move.h"
|
|
|
|
#include "gc/GCRuntime.h"
|
|
#include "gc/Heap.h"
|
|
|
|
#include "jsapi-tests/tests.h"
|
|
|
|
BEGIN_TEST(testGCChunkPool)
|
|
{
|
|
const int N = 10;
|
|
js::gc::ChunkPool pool;
|
|
|
|
// Create.
|
|
for (int i = 0; i < N; ++i) {
|
|
js::gc::Chunk* chunk = js::gc::Chunk::allocate(rt);
|
|
CHECK(chunk);
|
|
pool.push(chunk);
|
|
}
|
|
MOZ_ASSERT(pool.verify());
|
|
|
|
// Iterate.
|
|
uint32_t i = 0;
|
|
for (js::gc::ChunkPool::Iter iter(pool); !iter.done(); iter.next(), ++i)
|
|
CHECK(iter.get());
|
|
CHECK(i == pool.count());
|
|
MOZ_ASSERT(pool.verify());
|
|
|
|
// Push/Pop.
|
|
for (int i = 0; i < N; ++i) {
|
|
js::gc::Chunk* chunkA = pool.pop();
|
|
js::gc::Chunk* chunkB = pool.pop();
|
|
js::gc::Chunk* chunkC = pool.pop();
|
|
pool.push(chunkA);
|
|
pool.push(chunkB);
|
|
pool.push(chunkC);
|
|
}
|
|
MOZ_ASSERT(pool.verify());
|
|
|
|
// Remove.
|
|
js::gc::Chunk* chunk = nullptr;
|
|
int offset = N / 2;
|
|
for (js::gc::ChunkPool::Iter iter(pool); !iter.done(); iter.next(), --offset) {
|
|
if (offset == 0) {
|
|
chunk = pool.remove(iter.get());
|
|
break;
|
|
}
|
|
}
|
|
CHECK(chunk);
|
|
MOZ_ASSERT(!pool.contains(chunk));
|
|
MOZ_ASSERT(pool.verify());
|
|
pool.push(chunk);
|
|
|
|
// Destruct.
|
|
js::AutoLockGC lock(rt);
|
|
for (js::gc::ChunkPool::Iter iter(pool); !iter.done();) {
|
|
js::gc::Chunk* chunk = iter.get();
|
|
iter.next();
|
|
pool.remove(chunk);
|
|
js::gc::UnmapPages(chunk, js::gc::ChunkSize);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
END_TEST(testGCChunkPool)
|