/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkTObjectPool.h"
#include "SkTObjectPool.h"
#include "Test.h"
class PoolEntry {
public:
private:
SK_DECLARE_INTERNAL_SLIST_INTERFACE(PoolEntry);
};
static const int kNumItemsPerBlock = 3;
typedef SkTObjectPool<PoolEntry, kNumItemsPerBlock> ObjectPoolType;
static bool verifyPool(skiatest::Reporter* reporter,
const ObjectPoolType& pool,
const char* stage,
int available, int blocks) {
if (available != pool.available()) {
ERRORF(reporter, "%s - Pool available is %d not %d",
stage, pool.available(), available);
return false;
}
if (blocks != pool.blocks()) {
ERRORF(reporter, "%s - Pool blocks is %d not %d",
stage, pool.blocks(), blocks);
return false;
}
return true;
}
static const int kNumToAcquire = kNumItemsPerBlock * 5;
static void testObjectPool(skiatest::Reporter* reporter) {
ObjectPoolType pool;
SkTInternalSList<PoolEntry> used;
verifyPool(reporter, pool, "empty", 0, 0);
for (int index = 0; index < kNumToAcquire; ++index) {
used.push(pool.acquire());
int blocks = (index / kNumItemsPerBlock) + 1;
int available = (blocks * kNumItemsPerBlock) - (index + 1);
if (!verifyPool(reporter, pool, "acquire", available, blocks)) {
return;
}
}
int available = pool.available();
int blocks = pool.blocks();
for (int index = 0; index < kNumToAcquire / 2; ++index) {
pool.release(used.pop());
++available;
if (!verifyPool(reporter, pool, "release", available, blocks)) {
return;
}
}
available += used.getCount();
pool.releaseAll(&used);
REPORTER_ASSERT(reporter, used.isEmpty());
verifyPool(reporter, pool, "releaseAll", available, blocks);
}
DEF_TEST(ObjectPool, reporter) {
testObjectPool(reporter);
}