#include "common.h"
-#include <cds/container/chase-lev-deque.h>
+#include <cds/misc/chase-lev-deque.h>
#include <cds_test/stress_test.h>
#include <cstdlib>
#include <ctime>
class ChaseLevDequeTest : public cds_test::stress_fixture {
protected:
- static Deque *deque;
static atomic_int terminate_stealer;
static ullong *sums;
static ullong *succ_counts;
GetConfig(DequeStealerThreadCount);
GetConfig(DequeMainPassCount);
}
-
- static void StealerThread(int index) {
- while (!terminate_stealer.load(memory_order_relaxed)) {
- int res = deque->steal();
- if (res != EMPTY && res != ABORT) {
- sums[index] += res;
- succ_counts[index]++;
- }
- }
- }
-
- static void MainThread(int index, int push_percentage) {
- for (ullong i = 0; i < s_nDequeMainPassCount; i++) {
- if ((::rand() % 100) < push_percentage) {
- int item = ::rand() % 100;
- deque->push(item);
- push_sum += item;
- push_count++;
- } else {
- int res = deque->take();
- if (res != EMPTY) {
- sums[index] += res;
- succ_counts[index]++;
- }
- }
- }
- while (true) {
- int res = deque->take();
- if (res != EMPTY) {
- sums[index] += res;
- succ_counts[index]++;
- } else {
- break;
- }
- }
- }
};
atomic_int ChaseLevDequeTest::terminate_stealer;
ullong *ChaseLevDequeTest::succ_counts;
ullong ChaseLevDequeTest::push_count;
ullong ChaseLevDequeTest::push_sum;
-Deque *ChaseLevDequeTest::deque;
-TEST_F(ChaseLevDequeTest, ChaseLevDeque) {
- deque = new Deque();
+TEST_F(ChaseLevDequeTest, ChaseLevDeque_push_take) {
+ std::unique_ptr<Deque> deque(new Deque());
+ size_t sum = 0;
int res;
for (size_t i = 0; i < s_nDequePassCount; ++i) {
deque->push(i);
res = deque->take();
+ sum += res;
+ }
+ size_t supposed_sum = s_nDequePassCount * (s_nDequePassCount - 1) / 2;
+ if (sum != supposed_sum) {
+ std::cout << "Sequential deque take sum: " << sum << " != " << supposed_sum
+ << "\n";
+ }
+}
+
+TEST_F(ChaseLevDequeTest, ChaseLevDeque_push_steal) {
+ std::unique_ptr<Deque> deque(new Deque());
+ size_t sum = 0;
+ int res;
+ for (size_t i = 0; i < s_nDequePassCount; ++i) {
deque->push(i);
res = deque->steal();
+ sum += res;
+ }
+ size_t supposed_sum = s_nDequePassCount * (s_nDequePassCount - 1) / 2;
+ if (sum != supposed_sum) {
+ std::cout << "Sequential deque steal sum: " << sum << " != " << supposed_sum
+ << "\n";
}
}