90 lines
2.4 KiB
C++
90 lines
2.4 KiB
C++
#include "VersionedMap.h"
|
|
|
|
#include "Internal.h"
|
|
#include "PrintMutation.h"
|
|
|
|
#include <assert.h>
|
|
#include <inttypes.h>
|
|
#include <latch>
|
|
#include <string.h>
|
|
#include <thread>
|
|
|
|
void setAndClearPrev() {
|
|
debugVerboseEnabled = false;
|
|
weaselab::VersionedMap versionedMap{0};
|
|
|
|
auto setAndClear = [&versionedMap](int64_t version) {
|
|
const int64_t k = __builtin_bswap64(version);
|
|
const int64_t zero = __builtin_bswap64(0);
|
|
weaselab::VersionedMap::Mutation m[] = {
|
|
{(const uint8_t *)&zero, 8, (const uint8_t *)&k, 8,
|
|
weaselab::VersionedMap::Clear},
|
|
{(const uint8_t *)&k, 8, (const uint8_t *)&k, 8,
|
|
weaselab::VersionedMap::Set},
|
|
};
|
|
versionedMap.addMutations(m, sizeof(m) / sizeof(m[0]), version);
|
|
assert(versionedMap.getVersion() == version);
|
|
};
|
|
|
|
int64_t version = 0;
|
|
while (version < 1000) {
|
|
++version;
|
|
setAndClear(version);
|
|
}
|
|
|
|
std::latch ready{2};
|
|
|
|
auto writer = std::thread{[&]() {
|
|
ready.arrive_and_wait();
|
|
|
|
int64_t version = 1000;
|
|
while (version < 100000) {
|
|
++version;
|
|
setAndClear(version);
|
|
}
|
|
}};
|
|
|
|
ready.arrive_and_wait();
|
|
|
|
version = 0;
|
|
while (version < 1000) {
|
|
++version;
|
|
|
|
auto iter = versionedMap.begin(version);
|
|
|
|
auto m = *iter++;
|
|
int64_t k = __builtin_bswap64(version);
|
|
assert(m.notModifiedSince == version);
|
|
assert(m.param1Len == 8);
|
|
assert(m.param2Len == 8);
|
|
int64_t zero = __builtin_bswap64(0);
|
|
assert(memcmp(m.param1, &zero, 8) == 0);
|
|
assert(memcmp(m.param2, &k, 8) == 0);
|
|
assert(m.type == weaselab::VersionedMap::Clear);
|
|
|
|
m = *iter++;
|
|
assert(m.notModifiedSince == version);
|
|
assert(m.param1Len == 8);
|
|
assert(m.param2Len == 8);
|
|
assert(memcmp(m.param1, &k, 8) == 0);
|
|
assert(memcmp(m.param2, &k, 8) == 0);
|
|
assert(m.type == weaselab::VersionedMap::Set);
|
|
|
|
assert(iter == versionedMap.end(version));
|
|
}
|
|
|
|
writer.join();
|
|
|
|
debugVerboseEnabled = true;
|
|
printf("Before gc: %" PRId64 "\n", versionedMap.getBytes());
|
|
versionedMap.setOldestVersion(versionedMap.getVersion());
|
|
printf("After gc: %" PRId64 "\n", versionedMap.getBytes());
|
|
assert(versionedMap.getOldestVersion() == versionedMap.getVersion());
|
|
for (auto iter = versionedMap.begin(versionedMap.getVersion()),
|
|
end = versionedMap.end(versionedMap.getVersion());
|
|
iter != end; ++iter) {
|
|
printMutation(*iter);
|
|
}
|
|
}
|
|
|
|
int main() { setAndClearPrev(); } |