2017-07-06 23:47:28 +08:00
|
|
|
#include "common.hpp"
|
2016-08-02 20:23:39 +08:00
|
|
|
|
2017-02-18 18:54:37 +08:00
|
|
|
constexpr size_t THREADS_NO = std::min(max_no_threads, 1);
|
2016-08-02 20:23:39 +08:00
|
|
|
constexpr size_t elems_per_thread = 16e5;
|
|
|
|
|
2016-12-22 22:51:16 +08:00
|
|
|
// TODO: Memory leak at 1,600,000 elements (Kruno wrote this here but
|
2017-09-22 20:24:53 +08:00
|
|
|
// the previous (now deleted) memory_check method had invalid implementation)
|
2016-12-22 22:51:16 +08:00
|
|
|
// 1. implement valid memory_check
|
|
|
|
// 2. analyse this code
|
|
|
|
// 3. fix the memory leak
|
|
|
|
// 4. write proper test
|
2017-07-06 23:47:28 +08:00
|
|
|
int main(int, char **argv) {
|
2017-06-21 17:29:13 +08:00
|
|
|
google::InitGoogleLogging(argv[0]);
|
2016-12-22 22:51:16 +08:00
|
|
|
|
2017-09-22 20:24:53 +08:00
|
|
|
std::vector<std::thread> threads;
|
|
|
|
map_t skiplist;
|
2016-08-02 20:23:39 +08:00
|
|
|
|
2017-09-22 20:24:53 +08:00
|
|
|
// put THREADS_NO * elems_per_thread items to the skiplist
|
|
|
|
for (size_t thread_i = 0; thread_i < THREADS_NO; ++thread_i) {
|
|
|
|
threads.emplace_back(
|
|
|
|
[&skiplist](size_t start, size_t end) {
|
|
|
|
auto accessor = skiplist.access();
|
|
|
|
for (size_t elem_i = start; elem_i < end; ++elem_i) {
|
|
|
|
accessor.insert(elem_i, elem_i);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
thread_i * elems_per_thread,
|
|
|
|
thread_i * elems_per_thread + elems_per_thread);
|
|
|
|
}
|
|
|
|
// wait all threads
|
|
|
|
for (auto &thread : threads) {
|
|
|
|
thread.join();
|
|
|
|
}
|
2016-08-02 20:23:39 +08:00
|
|
|
|
2017-09-22 20:24:53 +08:00
|
|
|
// get skiplist size
|
|
|
|
{
|
|
|
|
auto accessor = skiplist.access();
|
|
|
|
permanent_assert(accessor.size() == THREADS_NO * elems_per_thread,
|
|
|
|
"all elements in skiplist");
|
|
|
|
}
|
2016-08-02 20:23:39 +08:00
|
|
|
|
2017-09-22 20:24:53 +08:00
|
|
|
for (size_t thread_i = 0; thread_i < THREADS_NO; ++thread_i) {
|
|
|
|
threads[thread_i] = std::thread(
|
|
|
|
[&skiplist](size_t start, size_t end) {
|
|
|
|
auto accessor = skiplist.access();
|
|
|
|
for (size_t elem_i = start; elem_i < end; ++elem_i) {
|
|
|
|
permanent_assert(accessor.remove(elem_i) == true, "");
|
|
|
|
}
|
|
|
|
},
|
|
|
|
thread_i * elems_per_thread,
|
|
|
|
thread_i * elems_per_thread + elems_per_thread);
|
|
|
|
}
|
|
|
|
// // wait all threads
|
|
|
|
for (auto &thread : threads) {
|
|
|
|
thread.join();
|
|
|
|
}
|
2017-02-18 18:54:37 +08:00
|
|
|
|
2017-09-22 20:24:53 +08:00
|
|
|
// check size
|
|
|
|
{
|
|
|
|
auto accessor = skiplist.access();
|
|
|
|
permanent_assert(accessor.size() == 0, "Size should be 0, but size is "
|
|
|
|
<< accessor.size());
|
|
|
|
}
|
2017-02-18 18:54:37 +08:00
|
|
|
|
2017-09-22 20:24:53 +08:00
|
|
|
// check count
|
|
|
|
{
|
|
|
|
size_t iterator_counter = 0;
|
|
|
|
auto accessor = skiplist.access();
|
|
|
|
for (auto elem : accessor) {
|
|
|
|
++iterator_counter;
|
|
|
|
cout << elem.first << " ";
|
2017-02-18 18:54:37 +08:00
|
|
|
}
|
2017-09-22 20:24:53 +08:00
|
|
|
permanent_assert(iterator_counter == 0, "deleted elements");
|
|
|
|
}
|
2016-08-02 20:23:39 +08:00
|
|
|
}
|