Changeset View
Changeset View
Standalone View
Standalone View
src/test/radix_tests.cpp
Show First 20 Lines • Show All 301 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(const_tree_test) { | ||||
BOOST_CHECK(mytree.remove(0)); | BOOST_CHECK(mytree.remove(0)); | ||||
BOOST_CHECK(mytree.remove(1)); | BOOST_CHECK(mytree.remove(1)); | ||||
BOOST_CHECK(mytree.remove(2)); | BOOST_CHECK(mytree.remove(2)); | ||||
BOOST_CHECK(mytree.remove(3)); | BOOST_CHECK(mytree.remove(3)); | ||||
CheckConstTree(mytree, false); | CheckConstTree(mytree, false); | ||||
} | } | ||||
#define THREADS 128 | static CustomArguments insertStressTestArguments({ | ||||
#define ELEMENTS 65536 | "-radix_insert_stress_test_threads", | ||||
"-radix_insert_stress_test_elements", | |||||
}); | |||||
BOOST_AUTO_TEST_CASE(insert_stress_test) { | BOOST_AUTO_TEST_CASE(insert_stress_test) { | ||||
typedef TestElement<uint32_t> E; | typedef TestElement<uint32_t> E; | ||||
int nThreads = gArgs.GetArg("-radix_insert_stress_test_threads", 128); | |||||
int nElements = gArgs.GetArg("-radix_insert_stress_test_elements", 65536); | |||||
RadixTree<E> mytree; | RadixTree<E> mytree; | ||||
std::atomic<uint32_t> success{0}; | std::atomic<uint32_t> success{0}; | ||||
std::vector<std::thread> threads; | std::vector<std::thread> threads; | ||||
for (int i = 0; i < THREADS; i++) { | for (int i = 0; i < nThreads; i++) { | ||||
threads.push_back(std::thread([&] { | threads.push_back(std::thread([&] { | ||||
MMIXLinearCongruentialGenerator lcg; | MMIXLinearCongruentialGenerator lcg; | ||||
for (int j = 0; j < ELEMENTS; j++) { | for (int j = 0; j < nElements; j++) { | ||||
uint32_t v = lcg.next(); | uint32_t v = lcg.next(); | ||||
if (mytree.remove(v)) { | if (mytree.remove(v)) { | ||||
success--; | success--; | ||||
std::this_thread::yield(); | std::this_thread::yield(); | ||||
} | } | ||||
auto ptr = RCUPtr<E>::make(v); | auto ptr = RCUPtr<E>::make(v); | ||||
Show All 15 Lines | for (int i = 0; i < nThreads; i++) { | ||||
})); | })); | ||||
} | } | ||||
// Wait for all the threads to finish. | // Wait for all the threads to finish. | ||||
for (std::thread &t : threads) { | for (std::thread &t : threads) { | ||||
t.join(); | t.join(); | ||||
} | } | ||||
BOOST_CHECK_EQUAL(success.load(), ELEMENTS); | BOOST_CHECK_EQUAL(success.load(), nElements); | ||||
// All the elements have been inserted into the tree. | // All the elements have been inserted into the tree. | ||||
MMIXLinearCongruentialGenerator lcg; | MMIXLinearCongruentialGenerator lcg; | ||||
for (int i = 0; i < ELEMENTS; i++) { | for (int i = 0; i < nElements; i++) { | ||||
uint32_t v = lcg.next(); | uint32_t v = lcg.next(); | ||||
BOOST_CHECK_EQUAL(mytree.get(v)->getId(), v); | BOOST_CHECK_EQUAL(mytree.get(v)->getId(), v); | ||||
auto ptr = RCUPtr<E>::make(v); | auto ptr = RCUPtr<E>::make(v); | ||||
BOOST_CHECK(!mytree.insert(ptr)); | BOOST_CHECK(!mytree.insert(ptr)); | ||||
BOOST_CHECK(mytree.get(v) != ptr); | BOOST_CHECK(mytree.get(v) != ptr); | ||||
} | } | ||||
// Cleanup after ourselves. | // Cleanup after ourselves. | ||||
RCULock::synchronize(); | RCULock::synchronize(); | ||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |