2 #include <cds/misc/chase-lev-deque.h>
3 #include <cds_test/stress_test.h>
14 typedef cds_others::ChaseLevDeque Deque;
15 static size_t s_nDequePassCount = 1000;
16 static size_t s_nDequeStealerThreadCount = 5;
17 static size_t s_nDequeMainPassCount = 100000000;
19 class ChaseLevDequeTest : public cds_test::stress_fixture {
22 static atomic_int terminate_stealer;
24 static ullong *succ_counts;
25 static ullong push_sum;
26 static ullong push_count;
28 static void SetUpTestCase() {
29 cds_test::config const &cfg = get_config("SequentialMisc");
30 GetConfig(DequePassCount);
31 GetConfig(DequeStealerThreadCount);
32 GetConfig(DequeMainPassCount);
35 static void StealerThread(int index) {
36 while (!terminate_stealer.load(memory_order_relaxed)) {
37 int res = deque->steal();
38 if (res != EMPTY && res != ABORT) {
45 static void MainThread(int index, int push_percentage) {
46 for (ullong i = 0; i < s_nDequeMainPassCount; i++) {
47 if ((::rand() % 100) < push_percentage) {
48 int item = ::rand() % 100;
53 int res = deque->take();
61 int res = deque->take();
72 atomic_int ChaseLevDequeTest::terminate_stealer;
73 ullong *ChaseLevDequeTest::sums;
74 ullong *ChaseLevDequeTest::succ_counts;
75 ullong ChaseLevDequeTest::push_count;
76 ullong ChaseLevDequeTest::push_sum;
77 Deque *ChaseLevDequeTest::deque;
79 TEST_F(ChaseLevDequeTest, ChaseLevDeque_push_take) {
80 std::unique_ptr<Deque> deque(new Deque());
83 for (size_t i = 0; i < s_nDequePassCount; ++i) {
88 size_t supposed_sum = s_nDequePassCount * (s_nDequePassCount - 1) / 2;
89 if (sum != supposed_sum) {
90 std::cout << "Sequential deque take sum: " << sum << " != " << supposed_sum
95 TEST_F(ChaseLevDequeTest, ChaseLevDeque_push_steal) {
96 std::unique_ptr<Deque> deque(new Deque());
99 for (size_t i = 0; i < s_nDequePassCount; ++i) {
101 res = deque->steal();
104 size_t supposed_sum = s_nDequePassCount * (s_nDequePassCount - 1) / 2;
105 if (sum != supposed_sum) {
106 std::cout << "Sequential deque steal sum: " << sum << " != " << supposed_sum