Skip to content

Commit cbb1fd3

Browse files
committed
Add some comments to ConcurrentReadableArrayTest.MultiThreaded. Add a second test to stress the snapshot code.
1 parent 1ac565d commit cbb1fd3

File tree

1 file changed

+66
-1
lines changed

1 file changed

+66
-1
lines changed

unittests/runtime/Concurrent.cpp

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,31 @@ TEST(ConcurrentReadableArrayTest, MultiThreaded) {
5656
};
5757
ConcurrentReadableArray<Value> array;
5858

59+
// The writers will append values with their thread number and increasing
60+
// values of x.
5961
auto writer = [&](int threadNumber) {
6062
for (int i = 0; i < insertCount; i++)
6163
array.push_back({ threadNumber, i });
6264
};
6365

6466
auto reader = [&] {
67+
// Track the maximum value we've seen for each writer thread.
6568
int maxByThread[writerCount];
6669
bool done = false;
6770
while (!done) {
6871
for (int i = 0; i < writerCount; i++)
6972
maxByThread[i] = -1;
7073
for (auto element : array.snapshot()) {
7174
ASSERT_LT(element.threadNumber, writerCount);
75+
// Each element we see must be larger than the maximum element we've
76+
// previously seen for that writer thread, otherwise that means that
77+
// we're seeing mutations out of order.
7278
ASSERT_GT(element.x, maxByThread[element.threadNumber]);
7379
maxByThread[element.threadNumber] = element.x;
7480
}
81+
82+
// If the max for each thread is the max that'll be inserted, then we're
83+
// done and should exit.
7584
done = true;
7685
for (int i = 0; i < writerCount; i++) {
7786
if (maxByThread[i] < insertCount - 1)
@@ -87,5 +96,61 @@ TEST(ConcurrentReadableArrayTest, MultiThreaded) {
8796
reader();
8897
});
8998

90-
ASSERT_EQ(array.snapshot().count(), writerCount * insertCount);
99+
ASSERT_EQ(array.snapshot().count(), (size_t)writerCount * insertCount);
100+
}
101+
102+
TEST(ConcurrentReadableArrayTest, MultiThreaded2) {
103+
const int writerCount = 16;
104+
const int readerCount = 8;
105+
const int insertCount = 100000;
106+
107+
struct Value {
108+
int threadNumber;
109+
int x;
110+
};
111+
ConcurrentReadableArray<Value> array;
112+
113+
// The writers will append values with their thread number and increasing
114+
// values of x.
115+
auto writer = [&](int threadNumber) {
116+
for (int i = 0; i < insertCount; i++)
117+
array.push_back({ threadNumber, i });
118+
};
119+
120+
auto reader = [&] {
121+
// Track the maximum value we've seen for each writer thread.
122+
int maxByThread[writerCount];
123+
for (int i = 0; i < writerCount; i++)
124+
maxByThread[i] = -1;
125+
bool done = false;
126+
while (!done) {
127+
auto snapshot = array.snapshot();
128+
// Don't do anything until some data is actually added.
129+
if (snapshot.count() == 0)
130+
continue;
131+
132+
// Grab the last element in the snapshot.
133+
auto element = snapshot.begin()[snapshot.count() - 1];
134+
ASSERT_LT(element.threadNumber, writerCount);
135+
// Each element we see must be equal to or larger than the maximum element
136+
// we've previously seen for that writer thread, otherwise that means that
137+
// we're seeing mutations out of order.
138+
ASSERT_GE(element.x, maxByThread[element.threadNumber]);
139+
maxByThread[element.threadNumber] = element.x;
140+
141+
// We'll eventually see some thread add its maximum value. We'll call it
142+
// done when we reach that point.
143+
if (element.x == insertCount - 1)
144+
done = true;
145+
}
146+
};
147+
148+
threadedExecute(writerCount + readerCount, [&](int i) {
149+
if (i < writerCount)
150+
writer(i);
151+
else
152+
reader();
153+
});
154+
155+
ASSERT_EQ(array.snapshot().count(), (size_t)writerCount * insertCount);
91156
}

0 commit comments

Comments
 (0)