Draw num writes directly

This commit is contained in:
2024-02-03 17:03:23 -08:00
parent a632d0cbbb
commit a73e366dc9

View File

@@ -474,11 +474,13 @@ template <class ConflictSetImpl> struct TestDriver {
}
Arena arena;
{
int numWriteKeys = arbitrary.bounded(10);
int numPointWrites = arbitrary.bounded(100);
int numRangeWrites = arbitrary.bounded(100);
int64_t v = ++writeVersion;
auto *writes = new (arena) ConflictSet::WriteRange[numWriteKeys];
auto *writes =
new (arena) ConflictSet::WriteRange[numPointWrites + numRangeWrites];
auto keys = set<std::string_view>(arena);
while (int(keys.size()) < numWriteKeys) {
while (int(keys.size()) < numPointWrites + numRangeWrites * 2) {
if (!arbitrary.hasEntropy()) {
return true;
}
@@ -487,37 +489,51 @@ template <class ConflictSetImpl> struct TestDriver {
arbitrary.randomBytes(begin, keyLen);
keys.insert(std::string_view((const char *)begin, keyLen));
}
auto iter = keys.begin();
int numWrites = 0;
for (int i = 0; i < numWriteKeys; ++i, ++numWrites) {
writes[numWrites].begin.p = (const uint8_t *)iter->data();
writes[numWrites].begin.len = iter->size();
++iter;
if (i + 1 < numWriteKeys && arbitrary.bounded(2)) {
++i;
writes[numWrites].end.p = (const uint8_t *)iter->data();
writes[numWrites].end.len = iter->size();
int i = 0;
for (int pointsRemaining = numPointWrites,
rangesRemaining = numRangeWrites;
pointsRemaining > 0 || rangesRemaining > 0; ++i) {
bool pointRead = pointsRemaining > 0 && rangesRemaining > 0
? bool(arbitrary.bounded(2))
: pointsRemaining > 0;
if (pointRead) {
assert(pointsRemaining > 0);
writes[i].begin.p = (const uint8_t *)iter->data();
writes[i].begin.len = iter->size();
writes[i].end.len = 0;
++iter;
--pointsRemaining;
} else {
writes[numWrites].end.len = 0;
assert(rangesRemaining > 0);
writes[i].begin.p = (const uint8_t *)iter->data();
writes[i].begin.len = iter->size();
++iter;
writes[i].end.p = (const uint8_t *)iter->data();
writes[i].end.len = iter->size();
++iter;
--rangesRemaining;
}
writes[numWrites].writeVersion = v;
writes[i].writeVersion = v;
#if DEBUG_VERBOSE && !defined(NDEBUG)
if (writes[numWrites].end.len == 0) {
if (writes[i].end.len == 0) {
fprintf(stderr, "Write: {%s} -> %d\n",
printable(writes[numWrites].begin).c_str(),
int(writes[numWrites].writeVersion));
printable(writes[i].begin).c_str(),
int(writes[i].writeVersion));
} else {
fprintf(stderr, "Write: [%s, %s) -> %d\n",
printable(writes[numWrites].begin).c_str(),
printable(writes[numWrites].end).c_str(),
int(writes[numWrites].writeVersion));
printable(writes[i].begin).c_str(),
printable(writes[i].end).c_str(),
int(writes[i].writeVersion));
}
#endif
}
assert(iter == keys.end());
cs.addWrites(writes, numWrites);
refImpl.addWrites(writes, numWrites);
assert(i == numPointWrites + numRangeWrites);
cs.addWrites(writes, numPointWrites + numRangeWrites);
refImpl.addWrites(writes, numPointWrites + numRangeWrites);
}
{
int numReads = arbitrary.bounded(10);
@@ -566,4 +582,4 @@ template <class ConflictSetImpl> struct TestDriver {
};
} // namespace
// GCOVR_EXCL_STOP
// GCOVR_EXCL_STOP