package edu.stanford.ppl.concurrent;
import junit.framework.TestCase;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
public class ConcurrentEmptyTest extends TestCase {
static final int outerPasses = 10000;
static final int innerOps = 5000;
static final int putPct = 50;
static final int numThreads = 2;
public void testConcurrentRemoves() {
final SnapTreeMap<Integer, Integer> map = new SnapTreeMap<Integer, Integer>();
final Random outerRand = new Random();
// final int[] actualKeys = new int[2 * numThreads * innerOps];
// final String[] actualOps = new String[2 * numThreads * innerOps];
for (int outer = 0; outer < outerPasses; ++outer) {
// final AtomicInteger pos = new AtomicInteger(actualKeys.length);
// final AtomicInteger threadIds = new AtomicInteger(1);
final int keyRange = 1 + outerRand.nextInt(100);
ParUtil.parallel(numThreads, new Runnable() {
final Random rand = new Random();
public void run() {
// final int id = threadIds.getAndIncrement();
// final String beginPut = id + " begin put";
// final String endPut = id + " end put";
// final String beginRemove = id + " begin remove";
// final String endRemove = id + " end remove";
for (int inner = 0; inner < innerOps; ++inner) {
final int pct = rand.nextInt(100);
final int key = rand.nextInt(keyRange);
// final int before = pos.decrementAndGet();
if (pct < putPct) {
map.put(key, key);
} else {
map.remove(key);
}
// final int after = pos.decrementAndGet();
// actualKeys[before] = actualKeys[after] = key;
// actualOps[before] = pct < putPct ? beginPut : beginRemove;
// actualOps[after] = pct < putPct ? endPut : endRemove;
}
}
});
// final SnapTreeMap<Integer, Integer> endMap = map.clone();
// final int endSize = map.size();
// final boolean endEmpty = map.isEmpty();
//
// final boolean[] present = new boolean[keyRange];
for (int i = 0; i < keyRange; ++i) {
if (map.remove(i) != null) {
// present[i] = true;
}
}
assertEquals(0, map.size());
// if (!map.isEmpty()) {
// System.out.println("break here!");
// }
assertTrue(map.isEmpty());
}
}
}