Skip to content

Commit 2bfa867

Browse files
committed
Add test for parallel HABS.set(startIndex, endIndex)
(cherry picked from commit de63579984dcf6b9c8965e0468f701e5d75875e8)
1 parent 597cb27 commit 2bfa867

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

core/src/test/java/org/neo4j/graphalgo/core/utils/paged/HugeAtomicBitSetTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import org.junit.jupiter.params.ParameterizedTest;
2424
import org.junit.jupiter.params.provider.CsvSource;
2525

26+
import java.util.concurrent.Executors;
27+
import java.util.concurrent.Phaser;
28+
2629
import static org.junit.jupiter.api.Assertions.assertEquals;
2730
import static org.junit.jupiter.api.Assertions.assertFalse;
2831
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -81,6 +84,47 @@ void setRange(int startIndex, int endIndex) {
8184
}
8285
}
8386

87+
@Test
88+
void setRangeParallel() {
89+
var bitSet = HugeAtomicBitSet.create(128, AllocationTracker.EMPTY);
90+
var phaser = new Phaser(5);
91+
var pool = Executors.newCachedThreadPool();
92+
pool.submit(new SetTask(bitSet, phaser, 0, 16));
93+
pool.submit(new SetTask(bitSet, phaser, 16, 32));
94+
pool.submit(new SetTask(bitSet, phaser, 40, 80));
95+
pool.submit(new SetTask(bitSet, phaser, 100, 127));
96+
phaser.arriveAndAwaitAdvance();
97+
phaser.arriveAndAwaitAdvance();
98+
99+
for (int i = 0; i < bitSet.capacity(); i++) {
100+
if (i >= 0 && i < 32) assertTrue(bitSet.get(i));
101+
else if (i >= 40 && i < 80) assertTrue(bitSet.get(i));
102+
else if (i >= 100 && i < 127) assertTrue(bitSet.get(i));
103+
else assertFalse(bitSet.get(i));
104+
}
105+
}
106+
107+
private static final class SetTask implements Runnable {
108+
private final HugeAtomicBitSet habs;
109+
private final Phaser phaser;
110+
private final long startIndex;
111+
private final long endIndex;
112+
113+
private SetTask(HugeAtomicBitSet habs, Phaser phaser, long startIndex, long endIndex) {
114+
this.habs = habs;
115+
this.phaser = phaser;
116+
this.startIndex = startIndex;
117+
this.endIndex = endIndex;
118+
}
119+
120+
@Override
121+
public void run() {
122+
phaser.arriveAndAwaitAdvance();
123+
habs.set(startIndex, endIndex);
124+
phaser.arrive();
125+
}
126+
}
127+
84128
@Test
85129
void testFlipping() {
86130
var bitSet = HugeAtomicBitSet.create(42, AllocationTracker.EMPTY);

0 commit comments

Comments
 (0)