tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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)