#include "VersionedMap.h" #include "Internal.h" #include "PrintMutation.h" #include #include #include #include #include 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(); }